2011-11-30 117 views
0

我在我的示范场,它指示用户是否愿意接收电子邮件更改布尔值

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

我也有一个选项观点:

[X]我不想接收电子邮件......

通过默认 receive_invites是因此复选框是打勾。不过,我希望用户勾选复选框,以便将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

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

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

+0

整点是不改变字段名,我有具有相同命名约定的其他字段(试图保持一致) –

+1

@NgoMinhNam如果它创建这些问题,命名约定有什么意义?最终目标是让代码可读,而不是因为一些约定而使其复杂化。 – DrTyrsa

0

为什么不从视图中删除单词“不”?

[X]我希望收到电子邮件...

否则,我建议从ModelForm改变UnsubscribeForm一个纯Form。然后你可以颠倒布尔所有你想要的,而不诉诸于欺骗。这是更多的工作,但如果你不能只是改变标签,它会起作用。

+0

我不能改变这些词,这是一个糟糕的UX顺便说一句。我不想使用Form,因为我需要使用模型中的其他字段,只有这个需要更改。 –