Django:如何在验证之前将数据添加到ModelForm子类中?

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)

Ĵ

nmb*_*ten 5

您可以重写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。