[英]Is it possible to set a Django BooleanField default value to True or False depending on a method's output?
[英]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.