Создание пользовательского Django формирует поле, которое использует два <вводит> s

Как я могу сделать поле Django, которое представляет себя как пара полей ввода?

Обоснование: Я пытаюсь записать новое пользовательское поле. Я буду использовать его для подобного капче сервиса. Сервис работает путем запроса вопроса - затем получение того и маркера. Проверка происходит путем отправки ответа наряду с маркером. Я хочу записать поле формы, которое инкапсулирует эту логику. Элементы должны представить (IMO) как

<input type="hidden" name="_token" value="1234567890" />
<input type="text" name="answer" />

И на утверждают, что мне нужно значение _token и answer проверить ответ.

5
задан Emil Ivanov 5 March 2010 в 12:11
поделиться

3 ответа

Взгляните на SelectDateWidget . Он разделяет ввод даты на три поля выбора.

В строке документа говорится:

Это также служит примером виджета, который имеет более одного элемента HTML и, следовательно, реализует value_from_datadict .

2
ответ дан 18 December 2019 в 11:55
поделиться

Я думаю, вы ищете MultiWidget , вы можете просто дать ему 2 обычных виджета, и он отобразит комбинацию.

9
ответ дан 18 December 2019 в 11:55
поделиться

Вот готовый пример (взят из моего блога):

class ComplexMultiWidget(forms.MultiWidget):
    def __init__(self, attrs=None):
        widgets = (
            forms.TextInput(),
            forms.SelectMultiple(choices=(('J', 'John'),
                                          ('P', 'Paul'),
                                          ('G', 'George'),
                                          ('R', 'Ringo'))),
            forms.SplitDateTimeWidget(),
        )
        super(ComplexMultiWidget, self).__init__(widgets, attrs)

    def decompress(self, value):
        if value:
            data = value.split(',')
            return [data[0], data[1],
                   datetime.datetime(*time.strptime(data[2],
                   "%Y-%m-%d %H:%M:%S")[0:6])]
        return [None, None, None]
    def format_output(self, rendered_widgets):
        return u'\n'.join(rendered_widgets)


class ComplexField(forms.MultiValueField):
    def __init__(self, required=True, widget=None, label=None, initial=None):
        fields = (
            forms.CharField(),
            forms.MultipleChoiceField(choices=(('J', 'John'),
                                               ('P', 'Paul'),
                                               ('G', 'George'),
                                               ('R', 'Ringo'))),
            forms.SplitDateTimeField()
        )
        super(ComplexField, self).__init__(fields, required,
                                           widget, label, initial)

    def compress(self, data_list):
        if data_list:
            return '%s,%s,%s' % (data_list[0],''.join(data_list[1]),
                                 data_list[2])
        return None

Пример использования:

>>> f = ComplexField(widget=ComplexMultiWidget())
>>> f.clean(['some text', ['J','P'], ['2007-04-25','6:24:00']])
u'some text,JP,2007-04-25 06:24:00'
>>> f.clean(['some text',['X'], ['2007-04-25','6:24:00']])
Traceback (most recent call last):
...
ValidationError: [u'Select a valid choice. X is not one of the available choices.']

>>> f.clean(['some text',['JP']])
Traceback (most recent call last):

>>> class ComplexFieldForm(Form):
            field1 = ComplexField(widget=ComplexMultiWidget())

>>> f = ComplexFieldForm({'field1_0':'some text','field1_1':['J','P'], 'field1_2_0':'2007-04-25', 'field1_2_1':'06:24:00'})
>>> print f
<tr><th><label for="id_field1_0">Field1:</label></th><td><input type="text" name="field1_0" value="some text" id="id_field1_0" />
<select multiple="multiple" name="field1_1" id="id_field1_1">
<option value="J" selected="selected">John</option>
<option value="P" selected="selected">Paul</option>
<option value="G">George</option>
<option value="R">Ringo</option>
</select>
<input type="text" name="field1_2_0" value="2007-04-25" id="id_field1_2_0" /><input type="text" name="field1_2_1" value="06:24:00" id="id_field1_2_1" /></td></tr>

>>> f.cleaned_data
{'field1': u'some text,JP,2007-04-25 06:24:00'}
4
ответ дан 18 December 2019 в 11:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: