ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-08-26 18:07:16  阅读:142  来源: 互联网

标签:python django django-forms


作为Django中表单验证的一部分,我想检查用户上次发帖的时间.

我已经看过了堆栈溢出的thisthis问题,它似乎解决了这个问题,并且最初使用了接受的答案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,然后将表单中的额外信息从初始化拉到表单中()?

我想将request.user传递给表单,然后我可以在表单范围的clean()方法中访问它来进行额外的检查,这相当于验证.

def clean(self):
    super(ArticleForm, self).clean()
    **check whether user has posted recently, if so, raise ValidationError**
    return self.cleaned_data

Ĵ

解决方法:

您可以覆盖CreateView的get_form_kwargs方法(在您的情况下为ArticleCreateView)以将用户传递给表单.

def get_form_kwargs(self):
    kwargs = super(ArticleCreateView, self).get_form_kwargs()
    kwargs['user'] = self.request.user
    return kwargs

覆盖表单的init方法

...
def __init__(self, *args, **kwargs):
    self.user = kwargs.pop("user")

现在,您可以在clean方法中使用self.user.

标签:python,django,django-forms
来源: https://codeday.me/bug/20190826/1732549.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有