ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

如果此字段未在构造函数中传递,则在Django Form clean()方法中设置字段值

2019-05-15 21:45:50  阅读:188  来源: 互联网

标签:python django django-models django-forms


我需要设置字段值,而不是传递给Django Form构造函数.

我有这样的模型和形式:

class Message(models.Model):
    created     = models.DateTimeField()
    text        = models.CharField(max_length=200, blank=True, null=True)
    active      = models.BooleanField(default=False)

class MessageForm(forms.ModelForm):
    class Meta:
        model   = Message
        exclude = ('created', 'active')

    def clean(self):
        # check if user is blocked
        if user.is_admin():
            self.cleaned_data['active'] = True
        return self.cleaned_data

预期:如果当前用户是管理员 – 我需要自动将消息设置为活动状态.用户不应该通过表单传递此参数.

实际:我看到保存的消息总是有“False”标志(我可以删除条件,在这种情况下我也看到该消息未激活).

请帮我理解,如何在clean()方法中设置这个“active”标志.

最佳答案:

之前的答案可行,但我喜欢在表单中封装所有表单的内部操作,比如显示什么和不显示什么.我知道你提到过你不想向构造函数发送字段值,但是如果你不介意发送用户,你的解决方案就可以了.
即你的构造函数:

def __init__(self, user):
    self.user = user
    super(BaseForm, self).__init__()

然后在你的干净,你只需将用户更改为self.user.
这还有另一个好处.明天你想根据你的用户分配更多字段,你不需要在视图中添加任何内容,只需将其添加到表单即可.

编辑:
添加要排除的字段时,它在清理的数据中不可用.相反,将其小部件设置为隐藏.

active = forms.BooleanField(widget=forms.HiddenInput)

编辑2:如果你真的不希望表格中的字段
在这种情况下,为什么不重写保存,而不是覆盖清理?

def save (self):
    super(BaseForm, self).save()
    if user.is_admin():
        self.instance.active=True
    super(BaseForm, self).save()

标签:python,django,django-models,django-forms
来源: https://codeday.me/bug/20190515/1110255.html

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

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

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

ICode9版权所有