如何在Django中创建动态生成的单选按钮表单

2 投票
2 回答
5234 浏览
提问于 2025-04-16 17:06

这里是图片描述

你好。

我刚开始学习Django,想要创建一个像上面图片那样的表单,使用HTML来实现。这个表单应该在用户选择一个单选按钮时保存数据。

请问如何在Django中实现这样的表单(请注意,用户不能选择多个答案)。

2 个回答

5

这里有个很好的例子,教你怎么做: https://code.djangoproject.com/wiki/CookBookNewFormsDynamicFields

基本上,你的表单代码会遵循这个模式:

from django import forms

class MyForm(forms.Form):
    static_field_a = forms.CharField(max_length=32)
    static_field_b = forms.CharField(max_length=32)
    static_field_c = forms.CharField(max_length=32)

    def __init__(self, dynamic_field_names, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)

        for field_name in dynamic_field_names:
            self.fields[field_name] = forms.CharField(max_legth=32)    # creates a dynamic field

使用示例:

>>> dynamic_fields = ('first_name', 'last_name', 'company', 'title')
>>> my_form = MyForm(dynamic_field_names=dynamic_fields)
>>> my_form.as_ul()
u'<li><label for="id_static_field_a">Static field a:</label> <input id="id_static_field_a" type="text" name="static_field_a" maxlength="32" /></li>\n<li><label for="id_static_field_b">Static field b:</label> <input id="id_static_field_b" type="text" name="static_field_b" maxlength="32" /></li>\n<li><label for="id_static_field_c">Static field c:</label> <input id="id_static_field_c" type="text" name="static_field_c" maxlength="32" /></li>\n<li><label for="id_first_name">First name:</label> <input id="id_first_name" type="text" name="first_name" maxlength="32" /></li>\n<li><label for="id_last_name">Last name:</label> <input id="id_last_name" type="text" name="last_name" maxlength="32" /></li>\n<li><label for="id_company">Company:</label> <input id="id_company" type="text" name="company" maxlength="32" /></li>\n<li><label for="id_title">Title:</label> <input id="id_title" type="text" name="title" maxlength="32" /></li>

这样会生成一个包含以下文本输入的表单:

  • 静态字段 a
  • 静态字段 b
  • 静态字段 c
  • 名字
  • 姓氏
  • 公司
  • 职位

只需用 forms.ChoiceField() 或者你想要的其他类型,替代 forms.TextField() 就可以了。

7

你想使用 ChoiceFieldRadioSelect

from django import forms

class GenderForm(forms.Form):
    CHOICES = (
        ('M', 'Male'),
        ('F', 'Female'),
    )
    choice = forms.ChoiceField(choices=CHOICES, widget=forms.RadioSelect())

记住,Django 的文档是你的好帮手

动态改变选项
如果你想能够动态创建表单,使用 ModelForm 可能会比 forms.Form 更好。下面是一个例子:

from django.db import models
from django.forms import ModelForm
from django import forms

class Answer(models.Model):
    answer = models.CharField(max_length=100)

    def __unicode__(self):
        return self.answer

class Question(models.Model):
    title = models.CharField(max_length=100)
    answers = models.ManyToManyField('Answer')

class QuestionForm(ModelForm):
    class Meta:
        model = Question
        fields = ('title', 'answers')
        widgets = {
            'answers': forms.RadioSelect(),
        }

在你的视图中,实例化表单时指定一个实例来使用:

question = Question.objects.order_by('?')[0]
form = QuestionForm(instance=question)

然后,表单会使用与该问题相关的答案(在这个例子中是随机选择的),并像往常一样将表单传递给模板的上下文。

撰写回答