2012-01-23 5 views
3

フォーム処理中に、ユーザーがドロップダウンからキーを選択することなくモデルオブジェクトに外部キーフィールドを設定できるようにしたいと考えています。例えばフォーム完了時に外部キーを設定する方法(python/django)

#models.py 
class AAA(models.Model): 

    some_field = models.TextField() 

class BBB(models.Model): 
    another_field = models.TextField() 
    key_field = models.ForeignKey('AAA') 
ユーザが「BBB」「AAA」を参照のパラメータを所与のインスタンスを作成するCREATE_OBJECTスタイルビューに「AAA」の例を示す図でナビゲートします

。外部キーは、 'AAA'インスタンスを指すコードに設定されています。

djangoコメントフレームワークはこれを行うようですが、どのように把握できません。

アイデア?私はそれがかなり単純であるべきだと確信しています。

答えて

20

モデルフォームからkey_fieldを除外し、commit=Falseで保存してから、key_fieldをデータベースに保存する前に設定することができます。

class BBBForm(forms.ModelForm): 
    class Meta: 
     model = BBB 
     exclude = ("key_field",) 

def create_view(request, **kwargs): 
    if request.method == "POST": 
     aaa = # get aaa from url, session or somewhere else 
     form = BBBForm(request.POST) 
     if form.is_valid(): 
      bbb = form.save(commit=False) 
      bbb.key_field = aaa 
      bbb.save() 
      return HttpResponseRedirect("/success-url/") 
     ... 
+0

Ah ha!私が欠けていた重要な機能は、「除外」ステートメントでした。以前は、 'key_field'が必須フィールドだったので、私のフォームは検証段階に達しませんでした。どうもありがとう! – powlo

+1

@paulus_almightyこの投稿があなたの問題を解決した場合は、あなたの受け入れられた(左側の緑のチェック) – juliomalegria

2

ユーザーがAAAのインスタンスを経由してBBBを作成するように、これはつまり、あなたの「CREATE_OBJECTスタイルビュー」はAAAオブジェクトを特定するパラメータを取得します、URLに反映されるべきです。

from django.shortcuts import get_object_or_404 

def create_bbb_view(request, aaa_id): 
    a = get_object_or_404(AAA, id=aaa_id) 
    form = MyBBBCreationForm(request.POST) # or similar code 
    if form.is_valid(): 
     b = BBB.objects.create(key_field=a) # plus other data from form 
    # ... 

を:あなたは、データベースからオブジェクトを取得し、それに応じて BBBオブジェクトを作成するためにそれを使用することができます(あなたが直接 aaa_idkey_fieldを設定することができますが、それはおそらくオブジェクトが存在するかどうかを確認することをお勧めします。)
関連する問題