【问题标题】:Django Module, App and Import Question - object has no attribute 'form'Django 模块、应用程序和导入问题 - 对象没有属性“表单”
【发布时间】:2011-08-08 07:18:37
【问题描述】:

如果用户是访客,我需要为我网站的每个页面加载一个注册表单。我认为最简单的方法是创建一个“注册”应用程序/模块并在 init.py 中定义表单变量,因此假设我导入了模块。但是,我在查看表单变量时遇到了一些麻烦。 “未定义全局名称'form'”以下是我的设置:

我有一个 /signup/init.py 和 /signup/form.py 文件。

这是我的 init.py

from django import forms
from signup.form import SignUpForm

form = SignupForm()

这是我的 form.py

class SignupForm(forms.Form):
    fullname = forms.CharField(min_length=3, max_length=25, initial='name', error_messages={'required': 'A unique username is required.', 'min_length': 'Your username must contain at least 3 characters.'})
    username = forms.CharField(min_length=3, max_length=25, initial='choose a username', error_messages={'required': 'A unique username is required.', 'min_length': 'Your username must contain at least 3 characters.'})
    password = forms.CharField(min_length=7, initial='choose a password', error_messages={'required': 'Please enter a password.','min_length': 'Your password must contain at least 7 characters.'})
    email = forms.EmailField(initial='e-mail address', error_messages={'required': 'Please enter a valid email address.', 'invalid': 'Please enter a valid email address.'})
    find_me = forms.BooleanField(initial=True, required=False)
    tos = forms.BooleanField(error_messages={'required': 'You must accept our Terms of Service.'})

我正在尝试从我的 /views/index.py 文件中加载它们:

from django.http import HttpResponse
from pymongo import *
from user import *
import mongo
from django.shortcuts import render_to_response
from django.template import RequestContext, loader
import signup

#index view
def index(request):

    return render_to_response('index.html',
        {'form': signup.form},
        context_instance=RequestContext(request),
    ) 

我删除了 index.py 中不相关的代码......但基本上......(我可能会有一个 if else 让 return 语句只在用户未注册时返回 'form':form)

我的做法完全错误吗?有人介意告诉我我做错了什么吗?

::编辑::

另外,我注意到我在返回中没有 signup.form,但这仍然会引发

AttributeError at /
'module' object has no attribute 'form'

错误。我更改了上面的代码以适应它

【问题讨论】:

    标签: python django


    【解决方案1】:

    我只想指出,你这样做的方式是一个非常糟糕的主意。您在每个请求中都有一个表单实例:这总是很危险,允许跨请求泄漏信息的可能性。不要这样做。

    相反,请使用 Django 必须为您执行此操作的内置机制:context processors。在您的 signup/form.py 中,定义一个简单的函数:

    def signup_form(request):
        return SignupForm()
    

    并将其添加到 settings.py 中的TEMPLATE_CONTEXT_PROCESSORS

    'signup.form.signup_form',
    

    【讨论】:

    • 非常感谢。我是 Django/Python 新手。我完全不知道你能做到这一点。 :)
    【解决方案2】:

    您应该使用from signup import formfrom signup import * 使form 变量在您的views.py 中可用。如果您执行import signup,它将使用命名空间signup 导入模块并解决您需要执行signup.form 的表单。

    【讨论】:

    • 是的,我只是意识到,在我发布这个之后......我尝试了 signup.form,它给了我 AttributeError at / 'module' object has no attribute 'form'
    • 另一个问题可能是form 的名称重叠。因为首先您会看到在注册 (signup.form) 中有一个 form.py。之后,您通过 init.py 中的 form = SignupForm()“覆盖”此表单变量。因此,您对不同的事物使用相同的名称。很可能这就是第二个回溯来自的原因。它根本无法正确解析form
    • 尝试重命名您的form 变量之一(signup.form 模块或您在 init.py 中的 form 引用)。然后看看你是否还有这个问题。
    • 将变量更改为 regform 仍然无法正常工作。我正在为我的 mongo 模块做同样的事情并且有效,所以我不知道为什么会这样。那和这之间的唯一区别是我在它之上调用了额外的对象。
    • 这听起来很奇怪,但可能是你的 python 路径中有两个 signup 模块。您能否以某种方式检查您是否导入了正确的模块(例如 print os.path.dirname(signup.__file__) 在您的视图中 index.py)。
    【解决方案3】:

    我不确定您通过将其分配给标识符来尝试做什么?

    我会这样做:

    #init.py:
    from django import forms
    from signup.form import SignUpForm
    
    #index view
    def index(request):
    
        return render_to_response('index.html',
            {'form': signup.SignUpForm()},
            context_instance=RequestContext(request),
        ) 
    

    #init.py:
    from django import forms
    from signup.form import SignUpForm as Form
    
    #index view
    def index(request):
    
        return render_to_response('index.html',
            {'form': signup.Form()},
            context_instance=RequestContext(request),
        ) 
    

    更新

    将您的 form.py 更改为:

    class SignUpForm(forms.Form):
    

    而不是:

    class SignupForm(forms.Form):
    

    【讨论】:

    • 有些粗略的事情正在发生......我在尝试在注册中导入任何内容时收到“没有名为表单的模块”。我什至尝试在 settings.py 中向 installed_apps 添加注册,结果相同。
    • 您需要在已安装的应用程序中使用它。我的猜测是您有 forms .py 并且您正在尝试导入注册。 表格。我还注意到您的课程是 SignupForm 并且您正在尝试导入 SignUpForm
    • 我之前更正了大小写问题..它确实被称为form.py而不是forms.py
    • “没有名为表单的模块”错误表明您有 import SignUpForm as form 而不是 import SignUpForm as Form 或者您的文件中还有 form = SignUpForm()
    猜你喜欢
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-14
    • 1970-01-01
    • 2016-11-17
    • 1970-01-01
    相关资源
    最近更新 更多