【发布时间】:2011-12-28 02:39:49
【问题描述】:
作为 Django 中表单验证的一部分,我想检查用户上次发帖的时间。
我在stackoverflow 上查看了this 和this 问题,它们似乎解决了这个问题,并且最初使用了已接受的答案here。本质上,目前的过程是在
期间添加 request.user 对象def form_valid(self, form):
CreateView 子类的方法。但是,这不允许在表单验证期间使用用户变量。
由于我想在验证期间访问用户变量,因为自上次发布以来的检查时间在逻辑上是验证,我需要提前将用户变量注入到表单中。
我尝试改变 get_initial() 方法:
def get_initial(self):
initial = super(ArticleCreateView, self).get_initial()
initial['user'] = self.request.user
return initial
这成功地设置了初始字典中的 ['user'] 键,但这永远不会通过清理过程,它只处理 ['data'] 字典中的内容,并删除初始的任何内容。我故意将用户从表单显示中排除,但这似乎也将其从清洁过程和验证中删除。
这样做的正确方法是覆盖Form的init()方法和视图的get_initial()方法,将'user'放入initial,然后表单拉取在 init() 处从初始到表单的额外信息?
我希望将 request.user 传递给表单,然后我可以在表单范围的 clean() 方法中访问它以进行额外的检查,这相当于验证。
def clean(self):
super(ArticleForm, self).clean()
**check whether user has posted recently, if so, raise ValidationError**
return self.cleaned_data
J
【问题讨论】:
-
表单是否引用了用户?如果是这样,您可以通过
self.cleaned_data['user']访问它 -
表单所基于的模型有一个用户字段,但这从表单中排除,因为用户不应该能够选择用户,它应该自动设置为他们。目前我一直在 CreateView 子类的 form_valid() 部分注入用户变量。是否可以编辑传递给验证步骤的 **kwargs? (即通过 get_form_kwargs()?)
标签: python django django-forms