Chave estrangeira do Django para um modelo ainda a ser criado

Eu estou querendo saber se existe uma maneira no Django de associar um modelo a outro, ainda a ser criado, com uma chave estrangeira. Ambos os modelos seriam criados usando o mesmo ModelForm na mesma página HTML.

por exemplo.

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

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

Basicamente, eu estou querendo saber se ambos os modelos podem ser colocados no mesmo <form> ... </form> em uma página HTML.

2

2 Respostas

uma chave estrangeira é uma referência à chave primária do modelo referenciado, portanto, o destino precisa existir. você precisa salvar o primeiro formulário e atualizar a referência no segundo antes de salvar. para obter uma instância de modelo de um formulário sem salvar no db, você pode usar

instance = form.save(commit=False)

você precisa salvar a instância você mesmo

instance.save()

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

1
adicionado
você pode simplesmente editar a instância antes de salvá-la. por exemplo. instance.team = instance2
adicionado o autor second, fonte
Como faço para atualizar a referência na segunda com o novo modelo salvo? Devo mudar alguma coisa no POST dict?
adicionado o autor bow, fonte

Você pode querer verificar a documentação para inlineformset , permite editar os objetos relacionados de um modelo na mesma view, também veja 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,
})

Aqui vai outro exemplo:

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
adicionado
Uau, obrigado pela resposta :). Eu consegui trabalhar usando o método second, mas definitivamente vou procurar os formsets.
adicionado o autor bow, fonte