【问题标题】:Change boolean value in Django ModelForm更改 Django ModelForm 中的布尔值
【发布时间】:2012-01-09 16:01:11
【问题描述】:

我的模型中有字段指示用户是否想要接收电子邮件

receive_invites = models.BooleanField(default=True, help_text="Receive an invite email from friends")

我也有一个选项:

[ x ] 我不想收到电子邮件...

默认receive_invites 为True,因此复选框勾选。但是,我希望用户勾选复选框,以便将 receive_invites 更改为 False。我在我的 ModelForm 中执行了以下操作来实现这一点。有没有人有更优雅的方式来做到这一点?

class UnsubscribeForm(forms.ModelForm):        
    class Meta:
        model = Entrant
        fields = ('receive_invites')

    def __init__(self, *args, **kwargs):
        if kwargs.has_key('instance'):
            instance = kwargs['instance']
            if instance.receive_invites:
                instance.receive_invites = False
            else:
                instance.receive_invites = True
        super(UnsubscribeForm, self).__init__(*args, **kwargs)

在我看来我有这个:

if request.method == 'POST':
    unsubscribe_form = UnsubscribeForm(request.POST, instance=me)

    if unsubscribe_form.is_valid():
        receive_invites = unsubscribe_form.cleaned_data['receive_invites']
        if receive_invites:
            user.receive_invites = False
        else:
            user.receive_invites = True
        unsubscribe_form.save()
        return redirect('index')
else:
    unsubscribe_form = UnsubscribeForm(instance=me)

【问题讨论】:

    标签: django boolean modelform


    【解决方案1】:

    加上@DrTyrsa,为了遵循字段命名约定而进行如此多的卷积是不合理的。如果您附加到该字段名称,则始终可以向模型添加一个属性,将数据字段映射到您关心的值:

    dont_receive_invites = models.BooleanField(default=False, help_text="Don't receive an invite email from friends")
    
    @property
    def receive_invites(self):
        return not self.dont_receive_invites
    

    【讨论】:

      【解决方案2】:

      为什么不直接从视图中删除“不”字样?

      [ x ] 我想接收电子邮件...

      否则,我建议将 UnsubscribeFormModelForm 更改为普通的 Form。然后你可以在不使用诡计的情况下反转所有你想要的布尔值。它的工作量更大,但如果你不能只更改标签,它就会起作用。

      【讨论】:

      • 我无法更改单词,顺便说一句,这是一个糟糕的用户体验。我不想使用 Form,因为我还需要使用模型中的其他字段,并且只需要更改这个。
      【解决方案3】:

      你不能改变模型?如果可以,请改为创建 dont_receive_invites 字段并节省大量时间。

      【讨论】:

      • 重点是不要更改字段名称,我还有其他字段具有相同的命名约定(尽量保持一致)
      • @NgoMinhNam 如果命名约定会产生这些问题,那么它的意义何在?最终目标是使代码可读,而不是因为某些约定而使其复杂化。
      猜你喜欢
      • 2014-01-06
      • 2012-03-25
      • 1970-01-01
      • 2020-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-29
      • 2019-09-03
      相关资源
      最近更新 更多