从一个表单提交创建父模型和子模型对象

时间:2011-04-18 01:21:14

标签: django django-models django-forms

我的模型有一个父对象,每个父对象可以有零个或多个由外键关联的子对象。

我的自动生成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)

3 个答案:

答案 0 :(得分:4)

实际上,所有这些功能都以inline model formsets

的形式提供

答案 1 :(得分: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")

我不确定你的urls.py,因为我从未使用过那个功能/快捷方式......很简单;)

答案 2 :(得分:0)

要使用内联模型表单集在一个视图中创建相关模型,请查看this SO post