【问题标题】:How can I have the equivalent of django's admin inlines in a modelform?如何在模型表单中拥有相当于 django 的管理员内联?
【发布时间】:2013-08-27 02:57:33
【问题描述】:

Django 的管理员允许您轻松创建用于编辑模型及其外键的表单,但如果我在自己的视图中使用 ModelForm,我将无法完成此操作。这是 admin.py 中的一个示例:

class VendorPhotoInline(admin.StackedInline):
  model = VendorPhoto
  extra = 3

class VendorAdmin(admin.ModelAdmin):
  inlines = [VendorPhotoInline]

admin.site.register(Vendor, VendorAdmin)

所以现在在管理员中,我可以创建一个供应商并添加一堆照片。但是对于编外人员,我有一个创建供应商的表格,我想允许他们像管理员一样上传一些照片。

我正在使用允许用户创建新供应商的 ModelForm,但当然,他们此时无法添加照片:

class VendorForm(ModelForm):
    class Meta:
        model = Vendor

如何在此处实现与管理界面的对等?我会选择一种仅适用于新供应商实例并允许上传最多特定数量(例如 3 个)的解决方案,但适用于现有实例并允许添加/删除照片的解决方案也很棒。感谢您的帮助!

【问题讨论】:

标签: python django django-forms django-admin django-views


【解决方案1】:

您可以使用inline formsets。来自文档:

假设你有这两个模型:

from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)

class Book(models.Model):
    author = models.ForeignKey(Author)
    title = models.CharField(max_length=100)

如果您想创建一个允许您编辑书籍的表单集 属于特定作者,您可以这样做:

>>> from django.forms.models import inlineformset_factory
>>> BookFormSet = inlineformset_factory(Author, Book)
>>> author = Author.objects.get(name=u'Mike Royko')
>>> formset = BookFormSet(instance=author)

inlineformset_factory 负责处理幕后事务,但对于前端部分,您可能会发现 django-dynamic-formset jQuery plugin 很有用。

【讨论】:

  • 谢谢,我在文档中看到了这一点,尽管它只是为书籍创建了一个表单集。我可能只是对 Django 表单缺乏很好的理解,但我不清楚如何在同一视图和模板
    中为新作者创建表单集,以及如何将新的内联书籍与新创建的作者关联。我想要一个视图/模板,它可以为我的示例的管理员执行 /add URL 的操作,允许在一个
    .
    中创建一个新的供应商和一些关联的 VendorPhotos
  • @mrooney,我认为您缺少的唯一见解是您可以在同一 HTML <form> 中拥有多个 Django 表单。您将父模型的 ModelForm 和表单集都传递给模板,然后在视图中处理它们。
  • 谢谢,太好了。我发现collingrady.wordpress.com/2008/02/18/… 有一些有用的视图代码,还演示了如何在保存父实例之前验证所有表单。
猜你喜欢
  • 2013-08-12
  • 2019-05-10
  • 2011-08-10
  • 2018-11-27
  • 2015-06-10
  • 1970-01-01
  • 1970-01-01
  • 2014-04-23
  • 1970-01-01
相关资源
最近更新 更多