在Django ModelForm中更改布尔值

时间:2011-11-30 11:57:01

标签: django boolean modelform

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

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)

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

  

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

否则,我建议您将UnsubscribeFormModelForm更改为普通Form。然后你就可以将所有你想要的布尔都反转,而不必诉诸欺骗。这是更多的工作,但如果你不能只改变标签就行了。

答案 2 :(得分:0)

添加到@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