Benutzerdefiniertes Django-Formular ImportError, obwohl sich die Datei im selben Verzeichnis befindet
-
21-12-2019 - |
Frage
Ich arbeite durch Effektive Djangos Tutorial-Reihe.Ich habe derzeit ein Problem beim Versuch, ein benutzerdefiniertes Formular zur Verwendung in einer App zu erstellen.Ich habe die Datei „forms.py“ wie in beschrieben erstellt Dieser Teil des Tutorials, und nahm die Änderungen an meiner Datei „views.py“ vor.Meine Verzeichnisstruktur sieht so aus:
(project root)
|
├── address.db
├── addressbook
│ ├── __init__.py
│ ├── __pycache__
│ ├── settings.py
│ ├── static
│ ├── urls.py
│ └── wsgi.py
├── contacts
│ ├── __init__.py
│ ├── admin.py
│ ├── forms.py
│ ├── models.py
│ ├── templates
│ ├── tests.py
│ └── views.py
├── manage.py
└── requirements.txt
Das Problem ist, dass ich beim Versuch, die Site zu laden, die folgende Fehlermeldung erhalte:
Traceback (most recent call last):
File "/Users/wtodom/.virtualenvs/tutorial/lib/python3.3/site-packages/django/core/handlers/base.py", line 101, in get_response
resolver_match = resolver.resolve(request.path_info)
File "/Users/wtodom/.virtualenvs/tutorial/lib/python3.3/site-packages/django/core/urlresolvers.py", line 318, in resolve
for pattern in self.url_patterns:
File "/Users/wtodom/.virtualenvs/tutorial/lib/python3.3/site-packages/django/core/urlresolvers.py", line 346, in url_patterns
patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
File "/Users/wtodom/.virtualenvs/tutorial/lib/python3.3/site-packages/django/core/urlresolvers.py", line 341, in urlconf_module
self._urlconf_module = import_module(self.urlconf_name)
File "/Users/wtodom/.virtualenvs/tutorial/lib/python3.3/importlib/__init__.py", line 90, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1586, in _gcd_import
File "<frozen importlib._bootstrap>", line 1567, in _find_and_load
File "<frozen importlib._bootstrap>", line 1534, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 586, in _check_name_wrapper
File "<frozen importlib._bootstrap>", line 1024, in load_module
File "<frozen importlib._bootstrap>", line 1005, in load_module
File "<frozen importlib._bootstrap>", line 562, in module_for_loader_wrapper
File "<frozen importlib._bootstrap>", line 870, in _load_module
File "<frozen importlib._bootstrap>", line 313, in _call_with_frames_removed
File "/Users/wtodom/.virtualenvs/tutorial/addressbook/urls.py", line 4, in <module>
import contacts.views
File "/Users/wtodom/.virtualenvs/tutorial/contacts/views.py", line 5, in <module>
import forms
ImportError: No module named 'forms'
Zeile 5 ist die Zeile in „views.py“, in die ich die Datei „forms.py“ importiere.Der Codeausschnitt (mit ein paar Zeilen Puffer) lautet:
from django.shortcuts import render
from django.views.generic import ListView, CreateView, UpdateView, DeleteView, DetailView
from django.core.urlresolvers import reverse
from contacts.models import Contact
import forms
class ListContactView(ListView):
model = Contact
template_name = 'contact_list.html'
Wie Sie dem Verzeichnisbaum entnehmen können, sollte auf die Datei „forms.py“ zugegriffen werden können.Ich bin mir nicht sicher, warum ich den Fehler erhalte.Irgendwelche Ideen?
Bearbeiten 1
Ich habe versucht, den Import auf zu ändern from forms import ContactForm
vor dem ursprünglichen Posten.Ich habe immer noch den gleichen Fehler:
File "/Users/wtodom/.virtualenvs/tutorial/contacts/views.py", line 5, in <module>
from forms import ContactForm
ImportError: No module named 'forms'
Lösung
Soweit ich weiß, gab es in Python 3 Änderungen im Importsystem.Geben Sie einfach genauer an, was Sie importieren möchten.Ich gehe davon aus, dass Sie importieren möchten forms.py
aus contacts
Also
from contacts import forms
oder du kannst es versuchen
import .forms
Andere Tipps
Es ist richtig, es so zu machen:
from forms import FormClassName
Oder du kannst
from forms import *
aber es ist nicht notwendig.Von anderen Apps müssen Sie
from contacts.forms import FormClassName # or wildcard '*'
Beim Importieren ist das Verzeichnis, das Python nach dem Import durchsucht, das Projektstammverzeichnis und es gibt kein Modul mit dem Namen „forms“.
Wenn Sie also einen Test durchführen möchten, erstellen Sie eine Datei mit dem Namen „forms“ im Projektstammverzeichnis und diese wird importiert.
Auf diese Weise wird das Folgende sicher funktionieren
from contacts.forms import FormClassName # or wildcard '*'