2011-11-12 80 views
2

我想知道是否有方法在Django中將模型關聯到另一個尚未創建的模型與外鍵。這兩個模型都將在同一個HTML頁面中使用相同的ModelForm創建。Django外鍵到一個尚未創建的模型

例如

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

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

基本上,我想知道,如果這兩種模式可以放在同一個<form>...</form>在一個HTML頁面。

回答

1

外鍵是對引用模型的主鍵的引用,所以目標需要存在。您需要保存第一個表格,然後在保存之前更新第二個表格的引用。擺脫形狀的模型實例不保存到數據庫中,可以使用

instance = form.save(commit=False) 

,那麼你需要自己保存實例

instance.save() 

,如果你使用的是多到許多領域,你需要看看save_m2m

+0

如何更新我在第二個與新的LY保存模型的參考?我應該改變POST字典中的內容嗎? – bow

+0

你可以在保存之前編輯'instance'。例如'instance.team = instance2' – second

1

你可能要檢查的文檔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)) 
+0

哇,謝謝你的回答:)。我用第二種方法工作,但我一定會查找formset。 – bow