jvc*_*c26 4 python django django-forms
作为Django中表单验证的一部分,我想检查用户上次发布信息的时间。
我已经看过这个了,这个关于stackoverflow的问题似乎解决了这个问题,并在这里最初使用了公认的答案。从本质上讲,目前的过程是在请求过程中添加request.user对象。
def form_valid(self, form):
Run Code Online (Sandbox Code Playgroud)
CreateView子类的方法。但是,这不允许在表单验证期间使用用户变量。
由于我想在验证期间访问用户变量,因为自上次发布以来的检查时间在逻辑上是验证,所以我需要将用户变量更早地注入表单。
我试过改变get_initial()方法:
def get_initial(self):
initial = super(ArticleCreateView, self).get_initial()
initial['user'] = self.request.user
return initial
Run Code Online (Sandbox Code Playgroud)
这样可以成功地在初始字典中设置['user']键,但是却无法使其通过清理过程,清理过程仅处理['data']字典中的内容,并删除初始的任何内容。我故意将用户从表单显示中排除,但这似乎也将其从清洁过程和验证中删除。
是这样做的正确方法是重写Form 的init()方法和视图的get_initial()方法,将“ user”放入初始,然后在表单中将额外的信息从初始移到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
Run Code Online (Sandbox Code Playgroud)
Ĵ
您可以重写CreateView的get_form_kwargs方法(在您的情况下为ArticleCreateView)将用户传递给表单。
def get_form_kwargs(self):
kwargs = super(ArticleCreateView, self).get_form_kwargs()
kwargs['user'] = self.request.user
return kwargs
Run Code Online (Sandbox Code Playgroud)
覆盖表单的init方法
...
def __init__(self, *args, **kwargs):
self.user = kwargs.pop("user")
Run Code Online (Sandbox Code Playgroud)
现在,您可以在clean方法中使用self.user。
| 归档时间: |
|
| 查看次数: |
4235 次 |
| 最近记录: |