如何在Django模板中显示单个模型的多种形式?

时间:2016-09-25 19:08:56

标签: django django-forms django-orm

我有这个模型注意:

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作为参数;但我确信它必须更清晰,只是我没有找到它。你能帮助我吗?谢谢!

2 个答案:

答案 0 :(得分:3)

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

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

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

在视图和模板中使用NoteEditFormSet几乎与使用常规表单相同,但是如果您想要执行任何复杂的操作,请注意一些差异,以便查看文档({ {3}}和view)。如果情况不够清楚,请在视图和模板中添加一些您尝试执行的操作的详细信息,然后我会尝试提供帮助。

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

更新

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

然后/notes/页面上的JS负责序列化单个笔记的数据并将请求发送到/notes/<note_id>/(记住CSRF令牌)。

为formset生成的HTML输入的ID前缀为id_form-<number>-,并且隐藏的输入包含Note主键,可以让您确定哪个ID前缀适用于每个音符。

答案 1 :(得分:-1)

我会考虑这样做

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

让我知道你的想法