当一个选项设置为True时,所有其他选项设置为False(BooleanField)

时间:2016-05-12 20:10:30

标签: python django django-views

我有这样的表格:

database

所以我可以添加一个新选项或编辑一个已存在的两个视图

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()

2 个答案:

答案 0 :(得分:1)

如果您的新选项有public static byte[] ReadBytes(string filename, uint address, int length) { var buff = new byte[length]; Stream fs = File.OpenRead(filename); BinaryReader b = new BinaryReader(fs); b.BaseStream.Seek(address, SeekOrigin.Begin); b.Read(buff, 0, length);//This is where it breaks. return buff; } ,请将所有现有选项设置为default=True,然后设置新选项default=false。当他们得救时,我不确定你的选择在哪里。您可能有更好的时间找出哪个选项是真的,只是设置为false。

答案 1 :(得分: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该怎么办?