Django模块,应用程序和导入问题 - 对象没有属性'形式'

时间:2011-04-19 01:04:43

标签: python django

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

我有/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中不相关的代码...但基本上......(我可能会为return语句设置一个if else,只返回'form':表单,当用户取消注册时)

我接近这个完全错了吗?有人介绍我做错了什么吗?

::编辑::

另外,我注意到我在返回时没有signup.form,但仍然会抛出

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

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

3 个答案:

答案 0 :(得分:2)

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

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

def signup_form(request):
    return SignupForm()

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

'signup.form.signup_form',

答案 1 :(得分:1)

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

答案 2 :(得分:1)

通过将其分配给标识符,我不确定您要做什么?

我会这样做:

#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),
    ) 

OR

#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):