2016-09-23 19 views
1

これは簡単な質問かもしれませんが、これを行う方法はわかりません。 私はDjangoに2つのモデルを持っています。自動塗りつぶしDjango OneToOneField

class ModelA(models.Model): 
    some_member = models.Charfield(...) 

class ModelB(models.Model): 
    model = OneToOneField(ModelA) 
    other_member = models.Charfield(...) 

ModelAのModelFormによって埋め、次いでModelBのフォームにリダイレクトされます。 OneToOneFieldを以前のフォームに基づいて自動入力する方法を教えてください。 ありがとうございます。


私はこのようにそれをやっている今

class ModelBView(CreateView): 
....... 
    def form_valid(self, form): 
     model_b = form.save(commit=False) 
     model_a_form = ModelAForm(self.request.POST) 
     model_b.model = model_a_form.save(commit=False) 
     model_b.save() 
     return super(ModelBView, self).form_valid(form) 

が、エラーを取得する:「...データは検証していなかったので作成できませんでした」

ここで問題は、私は単純にrequest.POSTによって以前のフォームからデータを取得できることです。 このデータはどのように入手できますか?

答えて

0

ModelSのModelFormからのデータをrequest.sessionまたはrequest.getに保存し、ModelBの次のページにリダイレクトすることができます。ModelBのモデルフィールドのデータを取得して入力できます。

+0

thxです。私はdjangoの新しいです。どうすればデータを保存できますか? – 5yn4x

0

正確に何を望むかによって異なります。

フィールドを2番目のフォームに自動入力する場合は、ModelBのフォームをインスタンス化するとき(例:ビュー内)にinitialキーワード引数を使用できます。一方で、あなたはMODELAがフィールドとして第二の形式で表示されますが、それでも結果のインスタンスにリンクしたくない、場合、あなたはこのような何かを行うことができます

def my_view(request): 
    """ 
    Save data to ModelA and show the user the form for ModelB 
    """ 
    if request.method == 'POST': 
     # Save ModelA instance 
     model_a_form = ModelFormA(request.POST) 
     if model_a_form.is_valid(): 
      model_a_instance = model_a_form.save() 

      # Once saved, show the user the form for ModelB, prefilled 
      # with the result from the previous form 
      model_b_form = ModelFormB(initial={'model': model_a_instance}) 

      # etc. Render the page as usual 
     else: 
      # ... 
    elif request.method == 'GET': 
     # ... 

取り扱いの際にこのような第2の形式の応答。

# ... instance of first model is saved in `model_a_instance` 

# Initiate an empty instance of ModelB, with the value of `model` field set to model_a_instance 
model_b_instance = ModelB(model=model_a_instance) 

# Provide it as an instance to your model form 
model_b_form = ModelFormB(request.POST, instance=model_b_instance) 

if model_b_form.is_valid(): 
    # Everything else should work fine. 

これが役に立ちます。

+0

Thx。私は2番目をしたい。これは非常に助けになります。しかし、私はどのようにCreateViewクラスでこれを行うことができますか? – 5yn4x

+0

ビューの 'get()'と 'post()'メソッドをオーバーライドし、そのロジックをその中に追加する必要があります。 –

+0

これを試しましたが、「データが検証されなかったために作成できませんでした」というエラーが表示されます。 – 5yn4x

関連する問題