2016-12-10 10 views
1

をクエリセットを変更:Djangoのフォーム - 私は単にモデル持って動的に

class ModelA(models.Model): 
    type = models.ForeignKey(Type) 
    amount = models.DecimalField() 
    product = models.ForeignKey(Product) 

をそして、私はそれのために

class ModelAForm(ModelForm): 
    class Meta: 
     model = ModelA 
     fields = [ 
      'type', 'amount', 'product' 
     ] 

そして、私はこの方法を行うことができますビューとモデルのフォームを作成しています

をフォームのユーザーが 'タイプ' - タイプ1を選択すると、 '製品'にはすべての製品があります。それは今働きます。

しかし、ユーザーが、私は(1年後、例えば古い)わずか数の製品で彼を表示したいTYPE2を選択

答えて

0

私はJSでこれを行うだろう。最初のドロップダウンが選択されると、選択した値に応じて、ijaxコールを起動してバックエンドから選択した値関連のコンテンツのみを取得し、製品のドロップダウンを更新します。

ブラウザで他のアクションをブロックして非同期に実行しないため、Ajaxはこのケースに適しています。でもあなたはAjaxのアップロードを行い、ので、あなたは、自分のフォームを検証する必要がある

+0

私はそう考えていました。しかし、このajax呼び出しをModelFormとどのように関連づけますか? Ajaxレスポンスには純粋な 'select html'が含まれていなければなりませんが、値がプロダクトIDです。そしてそれはうまくいくでしょうか? – Jeroj82

+0

はいいいえ。または、より良い方法があります:ajax経由でフロントエンドの製品を直接フィルタリングし、関連するものだけを表示します。コンテキスト内のすべての製品がテンプレートに含まれているため、バックエンドへのAJAX呼び出しは必要ありません – doniyor

0
  1. 、誰もが自分のフォームのコードをタイプし、製品IDのいずれかの組み合わせをあなたに送ることができます。私はそれがあなたにとって重要であるかどうかわかりません(タイプと製品の組み合わせとして注文を保管し、製品はタイプに関連していますか)。あなたが動的なフォームフィールドを探しているなら、あなたは動的なフォーム、sorteringとフィルタリングを作成することができdjango-select2ライブラリーを探すことができる

    from django.utils.translations import ugettext_lazy as _ 
    
    class ModelAForm(ModelForm): 
    
        # Your code here 
    
        def clean(self): 
         cleaned_data = super(ModelAForm, self).clean() 
         product_type = cleaned_data.get("type") 
         product = cleaned_data.get("product") 
    
         if product.type != product_type: 
          msg = _("Wrong product type.") 
          self.add_error('product', msg) 
    
  2. :これを行うには 。このタイプの製品が10,000個ある場合、クライアントがプレーンなDjangoフォームから製品を選択する例を示します。

関連する問題