0
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

field.clean が呼び出される前に clean_people が呼び出されないため、これは機能しません。ここで、field は ModelMultipleChoiceField のインスタンスであり、Python のリストまたはタプルをチェックして ValidationError を発生させ、clean_people をスキップします。呼び出しの順序がこのようになっている理由はありますか? また、この問題を回避するための標準的な規定はありますか? MyForm の各インスタンスで field.clean を lambda x:x に設定することもできましたが、これは非常に見苦しく思えます。MyForm の people フィールドを CharField として明示的に定義するのはおそらく正しいことでしょうか?

4

2 に答える 2

0

右のようですか?フォームで 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
于 2013-03-20T00:53:13.377 に答える
0

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() を定義するだけでは、それが前に呼び出されることを意味するわけではなく、まったく呼び出されることさえありません。

于 2013-03-18T17:03:40.937 に答える