使用MultipleChiceField和小部件复选框SelectMultiple对Django表单的HTML呈现进行Costumize

2024-06-16 09:52:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在创建一个Django表单,允许选择多个选项(复选框),并在数据库中存储字符列表。后端工作正常,但前端渲染不好。 实际上,html中没有出现复选框

这是我在models.py中所做的

from django.db import models

class MyModel(models.Model):
field = models.CharField(max_length=70, default='good')

在forms.py中

from django import forms
from .models import MyModel

CHOICES = (
    ('good', 'good'),
    ('c1', 'c1'),
    ('c2', 'c2'),
    ('c3', 'c3'),
    ('c4', 'c4'),
)

class MyForm(forms.ModelForm):
    field = forms.MultipleChoiceField(
        choices=CHOICES,
        widget=forms.CheckboxSelectMultiple,
    )

    class Meta:
        model = MyModel
        fields = ['field', ]

In views.py

from django.contrib import messages
from django.shortcuts import render, redirect
from .forms import MyForm

def new_odontogram(request):
    my_form = MyForm()
    if request.method == 'POST':
        my_form = MyForm(request.POST)
        if my_form.is_valid():
            my_form.save()
            messages.success(request,'Data stored !')
            return redirect('index')
    return render(request, 'my_form_page.html', {'my_form': my_form})

下面的html代码在my_form_page.html中适用于后端:

<form method="post">
    {% csrf_token %}
    {{ my_form.as_p }}
    <a href="{% url 'index' %}">
       <button type="submit">Record</button>
    </a>
</form>

但是,正如我在开始时提到的,没有显示任何框,我希望对它们进行成本分析。因此,我在某个地方读到,有一种方法可以循环使用这些选项,并添加一个有助于显示这些框的选项

所以我试了一下:

{% for option in my_form.field %}
    <label for="{{ option.id_for_label }}">
        <input type="checkbox" value="{{ option.choice_label }}" id="{{ option.id_for_label }}">
        <span class="checkable">{{ option.choice_label }}</span>
    </label>
{% endfor %}

这样我可以看到显示的框,但后端已损坏。如果您能帮助我正确设置这个html循环,我将不胜感激。我想name参数缺失了,但我不知道应该包含什么

这是在Django3.0.5和Python3.6.9上运行的,我正在使用CSS进行样式设置

提前谢谢你的帮助


Tags: djangofromimportformfieldformodelsrequest