如何让django ModelForm在对该字段运行clean_之前不清理该字段


class MyModel(models.Model) :
  people = models.ManyToManyField(User,related_name='people')
  ...
class MyForm(ModelForm) :
  class Meta :
     model = MyModel
     widgets = {'people':TextInput(),}
  def clean_people(self) :
     # turn a comma-separated list of names into a Python list
     return [name0,name1,...]
  def clean(self) :
     # if no other errors, turn list of names into list of Users

这不起作用,因为clean_people不会在字段之前被调用。clean被调用,其中field是ModelMultipleChoiceField的一个实例,它检查Python列表或元组,因此引发ValidationError并跳过clean_people。呼叫顺序是这样的有什么原因吗?是否有一些标准条款来避免这个问题?我可以设置field。在MyForm的每个实例中清除lambda x:x,但这看起来真的很难看。在MyForm中显式地将people字段定义为CharField是否正确?

为什么不重写clean的行为呢?

class MyForm(ModelForm):
    class Meta:
        model = MyModel
        widgets = {'people':TextInput(),}
    def clean_people(self):
        # turn a comma-separated list of names into a Python list
        return [name0,name1,...]
    # override below!
    def clean(self):
        super(MyForm, self).clean()
        # do stuff you need, eg: call clean_people(self)
        return self.cleaned_data

我不确定我100%理解你的问题,但只是通过在clean()之前定义clean_people()并不意味着它将在之前被调用,甚至被调用。

看来对不对?要在表单中定义people字段,覆盖该字段的模型思想

class MyModel(models.Model) :
  people = models.ManyToManyField(User,related_name='people')
  ...
class MyForm(ModelForm):
    people = CharField(...)
    class Meta :
       model = MyModel
    def clean_people(self) :
       # turn a comma-separated list of names into a Python list
       return [name0,name1,...]
    def clean(self) :
       # if no other errors, turn list of names into list of Users

最新更新