如果用户是访客,我有一个需要为我网站的每个页面加载的注册表单。我认为最简单的方法是创建一个“注册”应用程序/模块,并在 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'
错误。我更改了上面的代码以适应
答案 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 form
或from 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):