Виджет Джанго, который зависит от модели - PullRequest
0 голосов
/ 10 января 2019

Я довольно новичок в Django и у меня есть вопрос. Я получил ModelForm с помощью виджетов. Поскольку у меня есть поле с именем discount, которое я хочу редактировать только в том случае, если отображаемая модель удовлетворяет некоторым требованиям, я делаю его доступным только для чтения с помощью записи виджета:

class Meta: widgets = {'discount': forms.TextInput(attrs={'readonly': True})}

Теперь я хочу снова разрешить запись в это поле, если для модели (здесь называемой Порядок) тип поля установлен в целочисленное значение 0.

Я пытался сделать это в шаблоне html, но не получилось. Поэтому моя следующая идея - сделать виджет как-то зависимым от модели, которую он отображает, так что вроде псевдокод:

class Meta: widgets = {'discount': forms.TextInput(attrs={'readonly': currentModel.type == 0})}

Есть ли правильный способ сделать что-то подобное? Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Вы можете перезаписать __init__ вашего класса формы модели, чтобы изменить виджет:

class MyModelForm(...):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs):
        instance = kwargs['instance']
        self.fields['discount'].widget.attrs['readonly'] = instance.type == 0

Стоит отметить, что установка виджета на чтение только не мешает злоумышленнику в любом случае изменить поле. Убедитесь, что правильно проверили на стороне сервера.

0 голосов
/ 10 января 2019

Если вы не определите экземпляр модели при создании формы, у вас есть общее определение модели, а не экземпляр модели. Похоже, вы захотите изменить поведение формы после взаимодействия с пользователем, для этого вам нужно использовать JavaScript.

...