python - 在模板中渲染和自定义 django 表单

标签 python django django-forms

所以我成功地将表单输出到模板。但我在使用其中一种表单时遇到了一些麻烦,因为前端样式已经完成。我只是希望能够在已经存在的 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/

相关文章:

python - zip(list) 和 zip(*list) 的区别

python - xlrd 将字符串读取为 float

python - Django ModuleNotFoundError : No module named 'sql_server' With Docker

javascript - 对 Django 表单的 AJAX 或 Javascript POST 请求并获取结果

python - Django个人资料图片上传表单将图片保存在两个文件夹中

Python BigQuery 脚本 bigquery.jobs.create 错误

python - Pytorch 期望类型为 Long 但得到类型为 int

python - 如何在不使用自动模型表单的情况下从 Django 的文本框中获取数据?

python - 如何在 Django Rest Framework 中从两个模型编辑用户配置文件并保存更改

python - 如何从字典值更新现有模型实例