2011-04-18 53 views
5

我的模型有一個父對象,每個對象可以有零個或多個由外鍵關聯的子對象。從一個表單提交中創建父模型對象和子模型對象

我的自動生成ModelForm非常適合父對象,但我希望用戶能夠在創建父對象的同時創建一個或多個對象。注意,我並不是指從已有的子對象中挑選 - 我的意思是從頭開始創建子對象...

我目前使用很多django魔術來獲取表單,我:我意識到可能必須改變才能完成這個任務!

這裏是什麼,我目前所面對的一個想法:

# urls.py 
(r'^create/$', 
    CreateAppView.as_view(
     model=App, 
     template_name='edit.html')), 

 

# edit.html 
<form action="" method="post" enctype="multipart/form-data"> 
    {% csrf_token %} 
    {{ form.as_p }} 
<input type="submit" value="Submit" /> 
</form> 

 

# model 
class App(models.Model): 
    name = models.CharField(max_length=100) 

class Activation(models.Model): 
    app = models.ForeignKey(App) 

 

# view 
class AppForm(ModelForm): 
    class Meta: 
     model = App 

class CreateAppView(CreateView): 
    def post(self, request, *args, **kw): 
     form = AppForm(request.POST) 
     if form.is_valid(): 
      app = form.save() 
      return HttpResponseRedirect(reverse('app_detail', args=(app.id,))) 
     else: 
      return super(CreateAppView, self).post(request, *args, **kw) 

回答

2

添加不同名稱的多個表單?

接下來的問題是,你將不得不知道有多少表單正在呈現,並有一個更具體的模板。

類似:

# edit.html 
<form action="" method="post" enctype="multipart/form-data"> 
    {% csrf_token %} 
    {{ appform.as_p }} 
    {{ appform2.as_p }} 
<input type="submit" value="Submit" /> 
</form> 

,並在視圖:

appform= AppForm(request.POST, prefix="1") 
appform2= AppForm(request.POST, prefix="2") 

這也將爲不同影響模型的工作:

appform= AppForm(request.POST, prefix="app") 
spamform = SpamForm(request.POST, prefix="spam") 

我不知道你的網址。 py因爲我從來沒有使用過該功能/快捷方式... thingy;)

+0

是的,這將工作 - 你正確地指出了限制,即它是完美的我需要知道的數兒童對象提前(我不這樣做)。我的計劃是在父創建時(使用您的方法)創建一個單獨的子對象,然後允許一次添加一個新對象。 – MrMotivator 2011-04-18 12:36:20

+0

我想你在談論formset?閱讀Daniel發表的文章。 – 2011-04-18 23:30:39

3

實際上,所有這些功能已經以inline model formsets的形式提供。

+0

不幸的是,這似乎只處理編輯現有的對象,而不是從頭開始創建新的對象。還是)感謝你的建議!我可能會將其用於編輯頁面。 – MrMotivator 2011-04-18 12:34:58

+1

@MrMotivator一點都不 - 它確實處理添加新對象。這是管理員添加/編輯功能的實現方式。 – 2011-04-18 12:39:55

+0

內聯窗體集是真的爲此 – 2011-11-09 08:05:06

相關問題