2

Django 1.3.3 アプリケーションがあります。「プロモーション コード」タイプの機能を追加するように依頼されました。基本的に、ユーザーがこの 1 つの製品にサインアップするとき (注: システムのユーザー登録時ではありません)、プロモーション コードを入力することができます (お持ちの場合)。

この要件が与えられる前に、私はこの製品の登録ページを単純な ModelForm として持っていました。モデルに必要な変更を加え、「メンバー」モデルから新しいプロモーション モデルに外部キー フィールドを追加しました。

  • id (整数)
  • promo_code models.CharField(max_length=20)
  • number_of_days = models.IntegerField()

    def __unicode__(self):
        return u'{}'.format(self.promo_code)
    

フォームに追加すると、すべてのプロモーション コードを含むドロップダウン ボックスが表示されます。しかし、それは私が望むものではありません。コードを持っていて、それをテキスト ボックスに入力してもらいたいのです。次に、フォーム検証の一環として、有効なコードかどうかを確認します。コードをまったく持っていない可能性があることを忘れないでください (そのため、リストから選択するだけにはなりたくないのです)。

Django ModelForm でこのような要件を実装する最良の方法は何ですか?

注: バックアップして完全にカスタム フォームを作成できることはわかっていますが、すでに ModelForm で動作するページがあり、この機能を追加する必要があるだけです。

4

1 に答える 1

0

メンバーモデルの外部キーフィールドをフォームから除外します。

class MemberForm(ModelForm):
    class Meta:
        model = Member
        exclude = ('promo',) 

プロモーションコードのテンプレートに入力要素を追加します。次に、ビューでカスタム処理を少し行います-

def sign_up(request):
    #...
    if request.method == 'POST':
        form = MemberForm(request.POST)
        if form.valid():
            obj = form.save()
            if 'promo_field' in request.POST:
                try:
                    obj.promo = Promotion.objects.get(pk=request.POST['promo_field'])
                    obj.save()
                except DoesNotExist:
                    pass # the code wasn't valid
    else:
        #...

フォームの編集にジェネリックビュークラスを使用している場合は、form_valid()メソッドをオーバーライドしてプロモーションコードを追加します(上記のパターンを使用)。を使用して投稿データにアクセスできますself.request.POST

于 2013-02-27T19:36:25.963 に答える