【问题标题】:Create parent and children model objects from one form submission从一个表单提交创建父模型对象和子模型对象
【发布时间】:2011-04-18 01:21:13
【问题描述】:

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

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

【问题讨论】:

    标签: django django-models django-forms


    【解决方案1】:

    实际上,所有这些功能都已经以inline model formsets 的形式提供。

    【讨论】:

    • 不幸的是,这似乎只处理编辑现有对象,而不是从头开始创建新对象。还是)感谢你的建议!我可能会将它用于我的编辑页面。
    • @MrMotivator 一点也不——它肯定会处理添加新对象。这就是实现管理员添加/编辑功能的方式。
    • 内联表单集就是为此而生的
    • @PierredeLESPINAY 据我了解,创建内联表单集的默认选项仅在 1.7 中呈现子对象的字段,或者我在这里缺少什么?
    • 链接已废弃
    【解决方案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,因为我从来没有使用过那个函数/快捷方式……东西 ;)

    【讨论】:

    • 是的,这行得通-您正确地指出了限制,为了使其完美,我需要提前知道子对象的数量(我不知道)。我的计划是在创建父对象时创建一个子对象(使用您的方法),然后允许一次添加一个新对象。
    • 我认为您在谈论表单集?阅读丹尼尔发布的内容。
    猜你喜欢
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 2017-05-07
    • 2017-08-14
    • 2018-06-06
    • 1970-01-01
    相关资源
    最近更新 更多