0

重複の可能性:オーバーロードされたinit
を使用したフォームの検証

私はここで何が間違っているのかを理解しようと午後全体を費やしました。ユーザーがフォームに入力すると、場所選択ボックスはユーザーの国によって異なり、それに応じてさまざまな都市が一覧表示されます。

モデルとモデルフォーム

class Cars(models.Model):
    owner = models.ForeignKey(User)
    name = models.CharField(max_length=25)
    location = models.PositiveIntegerField(default=1)
    created = models.DateTimeField(default=utc_time)

class CarsForm(ModelForm):
    def __init__(self, country, *args, **kwargs):
        super(CarsForm, self).__init__(*args, **kwargs)
        self.fields['location'] = forms.ModelChoiceField(queryset=Cities.objects.filter(country=country))

    class Meta:
        model = Cars
        exclude = ('owner', 'created',)

意見

def new_car(request):
    if request.method == u'POST' and request.is_ajax():
        form = CarsForm(request.POST)
        if form.is_valid():
                      etc...

stackoverflow からのアドバイスに従い、モデルフォームinitを編集して国変数を渡せるようにしました。フォームの作成と html は正常に表示され、すべてがうまく機能しますが、フォームが検証されません。

更新:わかりました、私(「あなた」を意味します)が機能しているようです。いくつかの醜いものがありましたが、修正すると問題なく動作します。

  • 位置フィールドのタイプがforeignkeyに変更され、データの不一致の問題が修正されました
  • 国をkwargとして受け入れるようにinitが改訂されました
  • フォーム検証は変数を kwarg CarsForm(request.POST, country=country) として渡すようになりました

成功!1時間以内に。みんな本当にありがとう!!

4

2 に答える 2

1

あなたの変更は最初の引数を作成しますが、最初の引数としてデータをcountry渡しています。POSTform = CarsForm(request.POST)

于 2012-08-23T20:48:52.160 に答える
1

これが解決策であるか、コピーと貼り付けに問題があります;)

オーバーライドされたメソッドを正しく定義しましたが、実際にはパラメーター__init__を渡していません。countryこれを行うと、次のようになります。

form = CarsForm(country, request.POST)

つまり、 はrequest.POST常に格納され、親クラスのメソッドcountryに渡されることはありません。__init__

フォームがデータを取得しない場合、is_valid()は常に を返しFalseます。

補足: はSkillFormどこから来たのですか? する必要がありますCarsForm

于 2012-08-23T20:49:05.977 に答える