2016-05-12 254 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。我不确定你的选择何时被保存。你可能会有更好的时间找出哪个选项是真的,并设置错误。

相关问题