Django表单验证及会话数据的使用
我想解决的情况是,用户必须先下载一个文件,才能继续填写表单的下一步。
为了实现这个目标,我用Django创建了一个表单,用来收集用户的一般信息,这个表单会发送数据到Django的一个视图'A'。这个表单是通过一个模板显示的,模板里还包含一个iFrame,里面有一个简单的按钮,链接到Django的另一个视图'B'。
视图'B'的功能很简单,它会设置一个会话变量,表示文件已经下载,并返回文件的下载链接,从而触发下载。
在验证表单'A'(主要表单)时,我需要检查一下那个表示文件下载的会话变量是否已经设置。
我的问题是,这个检查最好是在表单'A'的验证过程中进行吗?如果是的话,应该怎么做最合适?
如果这样做不是个好主意,那这个验证应该在哪里进行呢?
2 个回答
2
为什么不呢,我觉得这样没问题。根据我所知道的,访问表单中的请求最方便的方法是把表单放在一个函数里:
def formX(request):
class FormX(forms.Form):
def clean(self):
if not request.session.get('file_downloaded', False):
raise ValidationError('File not downloaded!')
return FormX
(注意,关于 clean() 这个部分,这只是伪代码 - 我是凭记忆写的,可能不太记得表单清理的细节)
然后在视图中,你只需要写:
def my_view(request):
form = formX(request)(...)
13
你可以重写一下表单的 __init__
方法,让它可以接收 request
作为一个参数。
class MyForm(forms.Form):
def __init__(self, request, *args, **kwargs)
self.request = request
super(MyForm, self).__init__(*args, **kwargs)
def clean(self):
if not self.request.session.get('file_downloaded', False):
raise ValidationError('File not downloaded!')
def my_view(request):
form = MyForm(request, data=request.POST)
这样做可以把所有的验证逻辑都放在表单里面。