我正在尝试在模板中显示ManyToManyField:
class GvtCompo(models.Model):
startDate=models.DateField(max_length=10, blank=False, null=False)
endDate=models.DateField(max_length=10, blank=False, null=False)
gvtCompo= models.CharField(max_length=1000, blank=False, null=False)
class Act(models.Model):
gvtCompo= models.ManyToManyField(GvtCompo)
在我看来,我可以显示对象,没问题:
for gvtCompo in act.gvtCompo.all():
print gvtCompo.gvtCompo
在我的模板中,我有一个带有此代码的“GvtCompo对象”列表(不太好):
{% for field in form %}
<div class="fieldWrapper">
{{ field.errors }}
{{ field }}
</div>
{% endfor %}
我试图让它更好,但下面的代码不起作用(没有出现):
{% for field in form %}
{% if field.name == "gvtCompo" %}
{% for gvtCompo in field.gvtCompo.all %}
{{ gvtCompo.gvtCompo }}
{% endfor %}
{% endif %}
{% endfor %}
怎么了?
如果我不使用表单,但将模型实例(act)传递给render_to_response,则会显示ManyToManyField值
{% for gvtCompo in field.gvtCompo.all %}
更改为
{% for gvtCompo in act.gvtCompo.all %}
但是不再有表单字段,因此无法修改,验证和保存!
答案 0 :(得分:1)
你正在跳过一步。您首先需要创建一个表单。
在forms.py中,您可以创建一个ModelForm。 ModelForm是基于您的模型的表单:
来自django.forms导入ModelForm 来自myapp.models import Act
class ActForm(ModelForm):
class Meta:
model = Act
然后你的观点:
from myapp.models import Act
from myapp.forms import ActForm
def add_view(request):
if request.method == 'POST':
form = ArticleForm(request.POST)
if form.is_valid():
form.save()
else:
form = ActForm() # Creating a empty form.
return render_to_response("template.html", {
"form": form,
})
def edit_view(request):
obj = Act.objects.get(pk=1)
if request.method == 'POST':
form = ArticleForm(request.POST)
if form.is_valid():
form.save()
else:
form = ActForm(instance=obj) # Creating form pre-filled with obj.
return render_to_response("template.html", {
"form": form,
})
如果您想多次实施此情况。干:https://docs.djangoproject.com/en/1.5/topics/class-based-views/intro/#handling-forms-with-class-based-views
在template.html中:
{{ form }}
免责声明:此代码未经过测试。 https://docs.djangoproject.com/en/1.5/ref/forms/ https://docs.djangoproject.com/en/1.5/topics/forms/modelforms/
<强>更新强>
您可以将多个表单传递给模板中的一个<form>...</form>
。所以创建两个表单。一个法案表格(见上文)和一个GvtCompo表格集。 formset包含与Act有关的所有GvtCompo。
from django.forms.models import modelformset_factory
act = Act.objects.get(pk=1) #The same act as you used to create the form above.
GvtFormSet = modelformset_factory(GvtCompo)
formset = GvtFormSet(queryset=act.gvtCompo.all())
模板可以是:
<form ...>
{% for field in form %}
{% if field.name == "gvtCompo" %}
{{ formset }}
{% else %}
{{ field }}
{% endif %}
{% endfor %}
</form>
注意:如果您的表单和表单集有冲突的字段名称,请使用prefix =“some_prefix”: Django - Working with multiple forms
答案 1 :(得分:0)
在表单上循环时,它应该是:
{% for field in form %}
{% if field.name == "gvtCompo" %}
{% for gvtCompo in form.instance.gvtCompo.all %}
{{ gvtCompo.gvtCompo }}
{% endfor %}
{% endif %}
{% endfor %}
字段本身没有相关的field.gvtCompo
。