2011-11-30 192 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,因爲我需要使用模型中的其他字段,只有這個需要更改。 –