Внешний ключ Django для еще не созданной модели - PullRequest
2 голосов
/ 13 ноября 2011

Мне интересно, есть ли способ в Django связать модель с другой, еще не созданной моделью, с внешним ключом.Обе модели будут созданы с использованием одной и той же ModelForm на одной и той же HTML-странице.

Например,

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

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

В принципе, мне интересно, можно ли обе эти модели поместить в одну <form>...</form>на одной странице HTML.

Ответы [ 2 ]

1 голос
/ 13 ноября 2011

Вы можете проверить документацию для inlineformset , она позволяет редактировать связанные объекты модели в том же виде, также см. 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 голос
/ 13 ноября 2011

внешний ключ - это ссылка на первичный ключ ссылочной модели, поэтому цель должна существовать. вам нужно сохранить первую форму, а затем обновить ссылку на второй перед сохранением. чтобы получить экземпляр модели из формы без сохранения в БД, вы можете использовать

instance = form.save(commit=False)

вам нужно сохранить экземпляр самостоятельно

instance.save()

и если вы используете поля многие ко многим, вам нужно посмотреть на save_m2m

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...