Показать флажок как «отключен» в django 3.0. ModelForm - PullRequest
0 голосов
/ 28 апреля 2020

Я искал похожие проблемы, и мне еще не удалось найти решение моей конкретной проблемы c. То, что я хочу сделать, это отобразить флажок, подобный этому.

Если только зарегистрированный (прошедший проверку подлинности) пользователь имеет возможность установить / снять флажок, соответствующий его профилю. В этом случае интеллектуальное пространство аутентифицируется

Я достиг этой точки, попробовав это решение: Но, как один из комментариев предполагает, что метод create_option не вызывается через класс CheckboxSelectMultiple.

В результате я немного испортил класс SelectMultiple, вот так.

class CheckboxCustom(forms.SelectMultiple):


    def __init__(self, *args, **kwargs):
        self.input_type = 'checkbox'
        self.checked_attribute = {'checked': True}
        self.template_name = 'django/forms/widgets/checkbox_select.html'
        self.option_template_name = 'django/forms/widgets/checkbox_option.html'
        self.allow_multiple_selected = True
        self.request = kwargs.pop("request")
        self.option_inherits_attrs = False
        # print(options
        super(CheckboxCustom, self).__init__(*args, **kwargs)


    def create_option(self, *args, **kwargs):
        options_dict = super().create_option(*args, **kwargs)
        selected = options_dict['selected']
        print(selected)
        option_attrs = self.build_attrs(self.attrs, attrs) if self.option_inherits_attrs else {}
        # if selected:
        #     options_dict['attrs']['multiple'] = True

        if options_dict['label'] != str(self.request.user.profile):
            options_dict['attrs']['disabled'] = True
            # print(val)

        return options_dict

И использовал это как виджет. Однако независимо от того, выберу я или сниму один из двух флажков (из соответствующего профиля), другой будет отменен как в шаблоне, так и в базе данных.

То же самое происходит, если я использую обычные шаблоны SelectMultiple и типы ввода.

Есть ли способ решить мою проблему?

1 Ответ

0 голосов
/ 06 мая 2020

Я разработал решение, которое я опубликую здесь на случай, если кому-то будет интересно.

Как я уже упоминал, атрибут 'disabled' не позволяет любой форме данных получить POSTed. Это означает, что в поле MultipleSelect не может быть выбран тот, который отключен, и выбор POSTed является единственным, добавленным в базу данных (отключенный «удален»).

Для того, чтобы обойти это I присвоил полю атрибут «только для чтения», который я позже настроил с помощью CSS, и сделал его по своему вкусу небольшим скриптом JS. Вот код:

  • Установка атрибута только для чтения (DJANGO)
    def create_option(self, *args, **kwargs):

        options_dict = super().create_option(*args, **kwargs)
        selected = options_dict['selected']
        value = options_dict['value']

        #This is my own custom logic. It can be altered of course
        if options_dict['label'] != str(self.request.user.profile):
        #This is where the attribute is set!
            options_dict['attrs']['class'] = 'readonly'

  • Настройка поля только для чтения, чтобы оно выглядело серым и «отключен» (CSS)
    input.readonly {
      opacity : .50;
      filter  : alpha(opacity=50); /* IE<9 */
      cursor  : default;
    }
  • Небольшой скрипт для предотвращения манипулирования полем:
    $('input.readonly').on('click', function(evt) {
    evt.preventDefault();
 })
...