【问题标题】:How to display multiple forms of a single model in Django templates?如何在 Django 模板中显示单个模型的多种形式?
【发布时间】:2017-02-03 01:59:27
【问题描述】:

我有这个型号注意:

class Note(models.Model):
    category = models.ForeignKey(Category)
    author = models.ForeignKey('auth.User')
    title = models.CharField(max_length=40)
    text = models.TextField()
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

我想显示这个表格:

class NoteEditForm(forms.ModelForm):

    class Meta:
        model = Note
        fields = ('title', 'text')

在模板中,但我希望它出现在数据库中的 每个 现有 Note 对象中(必须如此)。我已经做了类似的事情,但后来我对表单进行了硬编码,指向编辑视图 URL,每个对象 pk 作为参数;但我确信它必须是一个更清晰的方法,只是我还没有找到它。你们能帮我解决这个问题吗?谢谢!

【问题讨论】:

    标签: django django-forms django-orm


    【解决方案1】:

    最简单的方法是使用formset(另见model formsets)。

    对于您的 Note 模型和 NoteEditForm,您可以执行类似的操作。您通常会将其放在您定义 NoteEditForm 的任何位置,但它可以放在另一个文件中,例如 views.py

    from django.forms import modelformset_factory
    NoteEditFormSet = modelformset_factory(Note, form=NoteEditForm)
    

    在视图和模板中使用 NoteEditFormSet 与使用常规表单几乎相同,但是如果您想做任何复杂的事情,请注意一些差异,请查看文档 (viewtemplate)。如果这还不够清楚,请在视图和模板中添加一些您正在尝试执行的操作的详细信息,我会尽力提供帮助。

    默认情况下,表单集将使用 Note.objects.all() 作为其查询集,这就是您所说的您想要的,但您可以更改它(详细信息在文档中介绍)。

    更新:

    要使用 AJAX 请求保存单个注释,我将添加第二个视图来处理这些请求。因此,如果您的所有 Notes 表单集由 /notes/ 的视图提供服务,您可以在 /notes/<note_id>/ 添加一个视图来处理您的 AJAX 请求(显然只是一个示例,调整以适应您的 URL 结构)。

    然后你在/notes/页面上的JS负责序列化单个note的数据并向/notes/<note_id>/发出请求(记住CSRF令牌)。

    为表单集生成的 HTML 输入的 ID 以 id_form-<number>- 之类的前缀为前缀,并且隐藏的输入包含 Note 主键,可让您确定哪个 ID 前缀适用于每个注释。

    【讨论】:

    • 伙计,这正是我想要的。现在我想发出 AJAX 请求来保存单个表单,而无需重新加载页面。我知道如何使用单个表单来做到这一点,但我也可以使用表单集来实现吗?
    • @JuliánBonilla 我添加了一些关于使用 AJAX 保存单个实例的信息。这不是一个全面的指南,但如果您已经知道如何为单个表单执行此操作,那么您可能不需要完整的教程。
    【解决方案2】:

    我会考虑这样做

    {% for note in Notequeryset %}
        <form action={% url 'url_name_to_form' pk={{note.pk}} %}>
        {{form.as_p}}
        </form>
    {% endfor %}
    

    让我知道你的想法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-13
      • 2013-02-16
      • 1970-01-01
      • 1970-01-01
      • 2019-10-09
      • 2016-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多