特定模块在Django中有表单导入错误
我在导入表单字段时遇到了一些问题。在我的 forms.py 文件里,有以下代码:
from django import forms
from django.forms import ModelForm
from koalified.seeker.models import *
from django.contrib.auth.models import User
class RegistrationForm(ModelForm):
username = forms.CharField(label=(u'Username'))
password = forms.CharField(label=(u'Password'), widget=forms.PasswordInput(render_value=False))
ver_password = forms.CharField(label=(u' Verify Password'), widget=forms.PasswordInput(render_value=False))
email = forms.EmailField()
class Meta:
model = Seeker
exclude = ('user','verified','premium')
def clean_username(self):
''' Checking username availability '''
username = self.cleaned_data['username']
try:
User.objects.get(username=username)
except User.DoesNotExist:
if len(username) >= 5 and len(username) < 21:
return self.cleaned_data['username']
else:
raise forms.ValidationError("Username must be between 5 and 20 characters")
raise forms.ValidationError("That username is already in use")
def clean_ver_password(self):
password = self.cleaned_data.get('password')
ver_password = self.cleaned_data.get('ver_password')
if not ver_password:
raise forms.ValidationError("You must confirm your password")
if password != ver_password:
raise forms.ValidationError("Passwords do not match")
return ver_password
我一直收到“视图不存在”的错误。我查了一下,建议我去命令行(shell)尝试导入。以下是导入的输出结果:
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/home/jmcguffee1/django.koalified.com/koalified/koalified/seeker/forms.py", line 6, in <module>
class RegistrationForm(ModelForm):
File "/home/jmcguffee1/django.koalified.com/koalified/koalified/seeker/forms.py", line 7, in RegistrationForm
username = forms.CharField(label=(u'Username'))
AttributeError: 'module' object has no attribute 'CharField'
我查看了一些问题,发现有人可能是拼写错误,但我试了很多次,还是无法加载这个表单。我的其他模块,比如登录表单,工作得很好。
from django.contrib.auth.models import User
from django import forms
class LoginForm(forms.Form):
username = forms.CharField(label=(u'Username'))
password = forms.CharField(label=(u'Password'), widget=forms.PasswordInput(render_value=False))
我尝试手动导入字段,结果是可以的,比如:
from django.forms.fields import CharField, EmailField
username = CharField()
这样可以正常工作。我又回到命令行,导入了 django.forms,并尝试从那里加载。
from django import forms
username = forms.CharField(label=(u'用户名'))
username
我检查了 models.py 和 views.py,确认没有循环调用,也没有其他导入 django forms 的地方。看起来这个特定的模块没有正确加载表单字段。如果还有不清楚的地方,我可以提供更多信息。
这是问题的解决方案:
>>> from django import forms
>>> print 'form is : ', forms
form is : <module 'django.forms' from '/home/jmcguffee1/django.koalified.com/kf/lib/python2.6/site-packages/Django-1.4.3-py2.6.egg/django/forms/__init__.pyc'>
>>> from koalified.seeker.models import *
>>> print 'form is : ', forms
form is : <module 'django.forms.forms' from '/home/jmcguffee1/django.koalified.com/kf/lib/python2.6/site-packages/Django-1.4.3-py2.6.egg/django/forms/forms.pyc'>
>>>
2 个回答
我猜在你的 models.py 文件里,你有引入 forms 模块吧?我觉得你是有的。那么这行代码就是问题所在:
from koalified.seeker.models import *
这行代码会把 models 模块里的所有全局名称都引入到当前的命名空间里。因为其中有一个名称是 forms
,它指向的是你当前的 forms 模块,所以这就覆盖了你最开始的引入:现在 forms
指的就是你自己的模块,而不是 Django 的 forms 模块了。
这就是为什么 **你绝对不应该使用 from x import *
的原因。你可以选择直接用 from koalified.seeker import models
,然后用 models.Seeker
等等来引用,或者用 from koalified.seeker.models import Seeker, TheOtherModel
等等。个人觉得第一种方式更好,但这其实是个人喜好问题。
使用星号导入会让命名空间变得很混乱。你可以试着加几个打印语句,像下面这样,然后检查一下在星号导入之后,“form”这个名字到底指向了什么。
from django import forms
print "forms is :", forms
# ....
from koalified.seeker.models import *
print "forms is :", forms