首页 > 解决方案 > Django 表单未在 html 页面中呈现

问题描述

我正在学习 Django 并使用 ModelForms 创建了表单。首先,我将 views.py 编写为函数,但是一旦我尝试将其设为类,表单就不会呈现,而其他标签正在工作。这是我views.py的功能方法

def company(request):
    company = Company.objects.all()
    cform = CompanyForm()
    form = CompanyForm(request.POST or None)
    if form.is_valid():
        form.save()
        return HttpResponseRedirect('/company')
    return render(request,'company/company.html',{
        'company': company,
        'cform':cform
    })

这是基于类的views.py

class CompanyView(generic.TemplateView):
    model = 'Company'
    template_name = 'company/company.html'

我已经更新了urls.py这样的

urlpatterns = [
    path('',views.IndexView.as_view(), name='index'),
    path('form/',views.CompanyView.as_view(),name='company'),
]

最后这是我的html模板

<h1>{{ company.company_name }}</h1>
<ul>
    {% for company in company.choice_set.all %}
    <li>{{ company.company_name }}</li>
    {% endfor %}
</ul>

<form method="post">
    {% csrf_token %}
    <fieldset>
        <legend>
            <h2> Company Form </h2>
        </legend>

        {{ cform.as_p }}

    </fieldset>
    <input type="submit" value="Submit" />
</form>

forms.py

from .models import Company

# create a ModelForm
class CompanyForm(forms.ModelForm):
    
    class Meta:
        model = Company
        fields = ('company_name','location','email_id')

什么时候class CompanyView(generic.DetailView):给我一个例外Exception Type: AttributeError at /company/form/ Exception Value: 'str' object has no attribute '_default_manager'。当其更新为class CompanyView(generic.FormView):错误异常时'NoneType' object is not callable

class CompanyView(generic.TemplateView):呈现除了{{ cform.as_p }}

我尝试了对模板的许多更改,但我无法在此处找到错误。

标签: pythondjango

解决方案


如果您使用基于类的视图,则不需要上面的函数定义,请务必将其删除。请参阅此处的文档

试试这个基于类的定义和模板:

class CompanyView(generic.FormView):
    template_name = 'company/company.html'
    form_class = CompanyForm
    success_url = '/redirect-to-somewhere/'

然后在您的 HTML 中,仅参考{{ form.as_p }}

<form method="post">
    {% csrf_token %}
    <fieldset>
        <legend>
            <h2> Company Form </h2>
        </legend>

        {{ form.as_p }}

    </fieldset>
    <input type="submit" value="Submit" />
</form>

推荐阅读