Django表单验证及会话数据的使用

4 投票
2 回答
3542 浏览
提问于 2025-04-16 04:30

我想解决的情况是,用户必须先下载一个文件,才能继续填写表单的下一步。

为了实现这个目标,我用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)

这样做可以把所有的验证逻辑都放在表单里面。

撰写回答