Как создать динамически созданную форму переключателей в Django - PullRequest
2 голосов
/ 06 мая 2011

enter image description here

привет.

Я новичок в Django, и я хочу создать форму, которая выглядит как изображение выше в HTML.форма должна сохранять данные, когда пользователь выбрал переключатель.

как реализовать такую ​​форму в django (обратите внимание, что пользователь не может выбрать более одного ответа)

Ответы [ 2 ]

7 голосов
/ 06 мая 2011

Вы хотите использовать ChoiceField и RadioSelect :

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)

Затем форма будет использовать ответы, связанные с этим Вопросом (в данном случае выбирается случайным образом), и, как обычно, передает форму в контекст шаблонов.

4 голосов
/ 22 июня 2011

Вот хороший пример того, как это сделать здесь: 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().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...