特定模块在Django中有表单导入错误

1 投票
2 回答
613 浏览
提问于 2025-04-17 20:14

我在导入表单字段时遇到了一些问题。在我的 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 个回答

0

我猜在你的 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 等等。个人觉得第一种方式更好,但这其实是个人喜好问题。

0

使用星号导入会让命名空间变得很混乱。你可以试着加几个打印语句,像下面这样,然后检查一下在星号导入之后,“form”这个名字到底指向了什么。

from django import forms
print "forms is :", forms
# ....
from koalified.seeker.models import *
print "forms is :", forms

撰写回答