我的模型中有字段,表示用户是否想要接收电子邮件
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)
答案 0 :(得分:0)
您无法改变模型?如果可以,请改为创建dont_receive_invites
字段并节省大量时间。
答案 1 :(得分:0)
为什么不从视图中删除“不要”字样?
[x]我想收到电子邮件......
否则,我建议您将UnsubscribeForm
从ModelForm
更改为普通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