Виджет RadioSelect не отображает метки в MultiWidget - PullRequest
0 голосов
/ 30 июня 2018

Я пытаюсь создать пользовательское поле MultiValue в django, которое состоит из двух виджетов: RadioSelect и TextInput: если пользователь выбирает «Другое», он может вставить туда значение.

Все работает, за одним странным исключением: ярлыки для переключателей не отображаются (см. Рисунок). Значения отображаются нормально, но меток просто нет. Что я делаю не так?

screen_shot_multi_value

fields.py

from .widgets import OtherSelectorWidget

class OtherModelField(models.CharField):
    def __init__(self, *args, **kwargs):
        self.inner_choices = kwargs.pop('choices', None)
        super().__init__(*args, **kwargs)

    def formfield(self, **kwargs):
        return OtherFormField(choices=self.inner_choices, **kwargs)


class OtherFormField(MultiValueField):
    def __init__(self, **kwargs):
        self.choices = kwargs.pop('choices')
        self.widget = OtherSelectorWidget(choices=self.choices)
        fields = (CharField(), CharField(),)
        super().__init__(fields=fields, require_all_fields=False, **kwargs)

    def compress(self, data_list):
        return str(data_list)

widgets.py

from datetime import date
from django.forms import widgets


class OtherSelectorWidget(widgets.MultiWidget):
    def __init__(self, choices=None, attrs=None):
        self.choices = choices
        _widgets = (
            widgets.RadioSelect(choices=choices),
            widgets.TextInput(attrs=attrs),
        )
        super().__init__(_widgets, attrs)

    def decompress(self, value):
        if value:
            return [value[0], value[1]]
        return [None, None, ]

    def format_output(self, rendered_widgets):

        return ''.join(rendered_widgets)

    def value_from_datadict(self, data, files, name):
        datelist = [
            widget.value_from_datadict(data, files, name + '_%s' % i)
            for i, widget in enumerate(self.widgets)]

        radio_data = self.widgets[0].value_from_datadict(data, files, name + '_0')
        text_data = self.widgets[1].value_from_datadict(data, files, name + '_1')
        try:
            D = [radio_data, text_data]
        except ValueError:
            return ''
        else:
            return D

1 Ответ

0 голосов
/ 30 июня 2018

похоже, что у Джанго глюк. Вот ссылка на билет: https://code.djangoproject.com/ticket/29200

Я справился с этим, добавив wrap_label в контекст виджета:

class OtherSelectorWidget(widgets.MultiWidget):

    def get_context(self, name, value, attrs):
        con = super().get_context(name, value, attrs)
        con['wrap_label'] = True
        return con

Тогда все отображается правильно

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