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