我有这个模型注意:
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作为参数;但我确信它必须更清晰,只是我没有找到它。你能帮助我吗?谢谢!
答案 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 %}
让我知道你的想法