0

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

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)
4

3 回答 3

0

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

于 2011-11-30T12:12:18.963 回答
0

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

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

否则,我建议UnsubscribeForm从 a更改ModelForm为 plain Form。然后你可以在不使用诡计的情况下反转所有你想要的布尔值。这是更多的工作,但如果你不能只更改标签,它会起作用。

于 2011-11-30T12:20:55.977 回答
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
于 2011-12-04T09:37:54.067 回答