Django 表单不呈现小部件

Django form not rendering widget

我不明白为什么 django 表单小部件没有在浏览器中呈现。

这是我的表格:

from django import forms
from .models import RealEstateTax

class CreateRealEstateForm(forms.ModelForm):
    class Meta: 
        model = RealEstateTax
        fields = ['invoice_number',]
        widget = {
            'invoice_number': forms.Textarea(attrs={'class': 'form-control', 'placeholder': 'Text goes here'}),
        }

出于测试目的,我将该字段重新归类为文本区域,并给它一个 class 文本应显示为红色的位置。

这是模板:

{% extends 'main.html' %}
{% load static %}

{% block title %} Create Realestate Tax {% endblock %}

{% block content %}

<style>
    .form-control {
        color: red;
    }
</style>


<form method="post">
    <div class="form-group">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit" class="btn btn-info">Send</button>
    </div>
</form>


{% endblock %}

当我在浏览器中检查元素时,没有 class,它不是 Textarea,文本也不是红色的:

这是我在视图中指定的:

from realestate.models import RealEstate
from django.shortcuts import render, redirect
from django.http import HttpResponse
from .models import *
from django.db.models import Sum
from realestate.models import RealEstate
from .forms import CreateRealEstateForm

def create_real_tax(request):
    form = CreateRealEstateForm
    if request.method == 'POST':
        form = CreateRealEstateForm(request.POST)
        if form.is_valid():
            form.save()

    print(form.base_fields)
    context = {'form':form}
    return render(request, 'billing/create_real_tax.html', context)

希望你能帮我解决这个问题。

非常感谢!

尝试用 form = CreateRealEstateForm() 替换 form = CreateRealEstateForm。 如果请求是 POST 请求,您目前只呈现表单,而当请求是 GET 时,您只引用 class。

此外,尝试将表格更改为:

class CreateRealEstateForm(forms.ModelForm):
    class Meta: 
        model = RealEstateTax
        fields = ['invoice_number',]
        widget = {
            'invoice_number': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Text goes here'}),
        }

能否请您尝试将小部件更改为这样的小部件:

widgets = {
            'invoice_number': forms.Textarea(attrs={'class': 'form-control', 'placeholder': 'Text goes here'}),
        }