2016-05-12 260 views
0

我有這樣的形式:當一個選項設置爲True設置爲False(BooleanField)所有其他

forms.py 

class OptionForm(forms.Form): 
    name = forms.CharField(widget=forms.TextInput(attrs={'class' : 'form-control'}), max_length=100, label='Option Name') 
    default = forms.BooleanField(label='Default', required=False) 

因此,我可以補充一點,已經與這兩種觀點存在一個新的選擇或編輯一個

views.py 

def new_opt(request): 
    if request.method=='POST': 
     fnewopt = OptionForm(request.POST) 
     if fnewopt.is_valid(): 
      model = OptionModel() 
      model.name = fnewopt.cleaned_data.get('name') 
      model.default = fnewopt.cleaned_data.get('default') 
      model.save() 

def edit_opt(request, id_opt): 
    opt = OptionModel.objects.get(id=id_opt) 
    if request.method == 'POST': 
     feditopt = OptionForm(request.POST) 
     if feditopt.is_valid(): 
      model = opt 
      model.name = feditopt.cleaned_data.get('name') 
      model.default = feditopt.cleaned_data.get('default') 
      modelo.save() 

但是我需要當用戶選擇一個選項爲默認不管是新的還是一個已經存在的所有其他選項設置默認爲False

回答

1

你可以通過自定義模型save()方法:

def save(self, *args, **kwargs): 
    super().save(*args, **kwargs) 

    if self.default: 
     # At this point self.pk will exist whether 
     # this was a new or updated instance. 
     # Using update() allows this to run in a single query 
     # (plus the query for super().save(), of course). 
     OptionModel.objects.exclude(pk=self.pk).update(default=False) 

其他一些注意事項:

  • 你應該換你save()方法在一個原子事務。

  • 每次保存選項時都會執行額外的update(),而不僅僅是第一次。爲避免這種情況,您必須檢測值更改爲True。有第三方軟件包可以讓你做到這一點,但它可能不值得麻煩。

  • 此問題與解答未解決驗證問題 - 如果另一個OptionModel已有default=True

+0

現在我解決了它,但使用視圖,你知道最好,定製'save()'方法還是在視圖中執行? –

+1

@ M.Gar:對於像這樣的事情 - 你試圖強制執行數據約束 - 你最好把它放在模型中(比如'save()')而不是視圖。首先,可以在視圖以外的地方創建對象(管理員,shell等)。另一方面,它使測試更容易。 –

+0

謝謝man =) –

1

如果您的新選項有default=True,請設置所有現有選項'default=false,然後設置新選項default = true。我不確定你的選擇何時被保存。你可能會有更好的時間找出哪個選項是真的,並設置錯誤。

相關問題