まだ作成されていないモデルに対するDjangoの外部キー

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

例えば

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

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

基本的には、これらのモデルを同じHTMLページで同じ <form> ... </form> に配置できるかどうかは疑問です。

2

2 答え

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

instance = form.save(commit=False)

インスタンスを自分で保存する必要があります

instance.save()

and if you are using many-to-many fields, you need to look at save_m2m

1
追加された
保存する前に instance を編集するだけです。例えば instance.team = instance2
追加された 著者 second,
2番目のリファレンスを新しい保存モデルで更新するにはどうすればよいですか? POST Dictで何かを変更する必要がありますか?
追加された 著者 bow,

あなたはインラインフォームセットを使用して、同じビュー内のモデルの関連オブジェクトを編集することもできます。 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))
1
追加された
うわー、答えに感謝:)。私は2番目の方法を使って作業していますが、私は間違いなく形式を調べます。
追加された 著者 bow,