簡體   English   中英

當一個選項設置為True時,所有其他選項設置為False(BooleanField)

[英]When one option set to True all others set to 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

如果您的新選項具有default=True ,請設置所有現有選項的default=false然后將新選項default = true 我不確定您的選擇在保存后會去哪里。 您可能會有更好的時間來找出哪個選項是正確的,然后將其設置為false。

您可以通過自定義模型的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怎么辦?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM