所以我成功地将表单输出到模板。但我在使用其中一种表单时遇到了一些麻烦,因为前端样式已经完成。我只是希望能够在已经存在的 HTML 中输出标签名称等。我可以使用以下命令将表单输出到模板:
<form method="post">
{% csrf_token %}
{{enquiry_form.as_ul}}
<button type="submit" class="submit softcolor">
<span>Submit</span>
</button>
</form>
但是,我的模型上有一个多对多字段,我希望用户能够使用复选框勾选多个选项。当我输出上面的内容时,我会得到一个选择框,以及它正在拉动的类别列表。
{% csrf_token %}
{% for fields in enquiry_form %}
<div class="block-365 center clearfix">
<label>{{fields.label}}</label>
<div class="input-line">
<input name="">
</div>
</div>
{% endfor %}
所以我可以做类似上面的事情,效果很好。但由于某种原因,CSRF 保护停止工作。我还需要能够访问宣传册模型中的项目(manyToMany 字段)。
这是我到目前为止的代码:
表单.py
from django.forms import ModelForm
from django import forms
from contact_enquiries import models
class ContactEnquiryForm(ModelForm):
class Meta:
model = models.ContactForm
fields=('name','email','company', 'subject', 'message')
class BrochureRequestForm(ModelForm):
class Meta:
model = models.ContactForm
fields = ('name', 'email', 'company', 'address', 'brochure',)
View .py
from contact_enquiries import forms
from django.shortcuts import render
from django.http import HttpResponseRedirect
def contact(request):
if request.method == 'POST':
form = forms.ContactEnquiryForm(request.POST)
en_form = forms.BrochureRequestForm(request.POST)
print(request.POST)
if form.is_valid():
#print "Form looks good!"
#e = models.ContactEnquiry(form.cleaned_data)
#e.save()
form.save()
return HttpResponseRedirect('/thanks/')
else:
form = forms.ContactEnquiryForm()
en_form = forms.BrochureRequestForm()
return render(request, 'contact.html', {
'contact_form' : form,
'enquiry_form' : en_form,
})
模型.py
class ContactForm(models.Model):
name = models.CharField(max_length="300")
company = models.CharField(max_length="200")
email = models.CharField(max_length="300")
subject = models.TextField()
message = models.TextField()
address = models.TextField()
brochure = models.ManyToManyField("Brochure", blank=True)
def __unicode__(self):
self.name
class Meta:
verbose_name = "Contact Enquiry"
verbose_name_plural = "Contact Enquiries"
class Brochure(models.Model):
title = models.CharField(max_length="200")
def __unicode__(self):
self.title
class Meta:
verbose_name = "Brochure"
verbose_name_plural = "Brochures"
并且 HTML 显示在上面。不确定将表单输出到模板时最好的方法是什么,但我需要能够使用提供的 HTML/CSS 来节省重新做的时间。另外,我需要能够使小册子表单上的复选框正常工作。因为我们的想法是,当他们填写表单时,他们可以选择要发送的 PDF。
有任何问题请追问!
最佳答案
好吧,事实证明我可以像这样渲染模板:
{% csrf_token %}
{% for fields in enquiry_form %}
<div class="block-365 center clearfix">
<label>{{fields.label}}</label>
<div class="input-line">
<input name="">
</div>
</div>
{% endfor %}
然后在我的类中,我设置要输出到模板的字段,我可以将小部件设置为该字段,如下所示:
fields = ('name', 'email', 'company', 'address', 'brochure',)
widgets = {'brochure': forms.CheckboxSelectMultiple()}
这会将 ManytoManyField 呈现为复选框。
关于python - 在模板中渲染和自定义 django 表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18192087/