2011-11-12 9 views
2

Djangoでモデルを他のまだ作成されていない外部キーを持つモデルに関連付ける方法があるのだろうかと思います。どちらのモデルも、同じHTMLページで同じModelFormを使用して作成されます。まだ作成されていないモデルへのDjango外部キー

class Team(models.Model): 
    name = forms.CharField 
    ... 

class Player(models.Model): 
    name = forms.CharField() 
    key = forms.ForeignKey(Team) 
    ... 

これらのモデルの両方が1つのHTMLページに同じ<form>...</form>に入れることができるならば基本的に、私は思ったんだけど。

答えて

1

外部キーは参照モデルの主キーへの参照であるため、ターゲットが存在する必要があります。最初のフォームを保存し、保存する前に2番目のフォームの参照を更新する必要があります。 DBに保存せずにフォームからモデルのインスタンスを取得するには、あなたが

instance = form.save(commit=False) 

を使用することができますが、インスタンスを保存する必要があり、自分

instance.save() 

、あなたは多対多のフィールドを使用している場合、 、あなたはあなたがinlineformsetのためのマニュアルを確認したい場合がありsave_m2m

+0

は、どのように私は新しいLY保存されたモデルで二番目に参照を更新していますか? POST Dictで何かを変更する必要がありますか? – bow

+0

あなたはそれを保存する前に 'instance'を編集することができます。例えば'instance.team = instance2' – second

1

を見る必要があり、それはまた、formsetsを参照して、同じビューにモデルの関連オブジェクトを編集することができます。ここで

def manage_teams(request, team_id): 
    team = Player.objects.get(pk=team_id) 
    PlayerInlineFormSet = inlineformset_factory(Player, Team) 
    if request.method == "POST": 
     formset = PlayerInlineFormSet(request.POST, request.FILES, instance=team) 
     if formset.is_valid(): 
      formset.save() 
      # Do something. 
    else: 
     formset = PlayerInlineFormSet(instance=team) 
    return render_to_response("manage_teams.html", { 
     "formset": formset, 
}) 

別の例を行く:

from django.forms.models import inlineformset_factory 
def new_team(request): 
    PlayerInlineFormSet = inlineformset_factory(Team, Player) 
    team= Team() 
    if request.method == 'POST': 
     form_team = TeamForm(request.POST, request.FILES, instance= team, prefix= 'team') 
     form_player = PlayerInlineFormSet(request.POST, request.FILES, instance= team, prefix= 'players') 
     if form_team.is_valid() and form_player.is_valid(): 
      form_team.save() 
      form_player.save() 
      return HttpResponseRedirect('/teams/%s/' % team.slug) 
    else: 
     form_team = TeamForm(instance= team, prefix= 'team') 
     form_player = PlayerInlineFormSet(instance= team, prefix= 'players') 
    return render_to_response('Teams/new_team.html', {'form_team': form_team, 'form_player':form_player}, context_instance=RequestContext(request)) 
+0

うわー、答えてくれてありがとう:)。私は2番目の方法を使って作業していますが、私は間違いなく形式を調べます。 – bow

関連する問題