Виджет Django, который зависит от модели

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

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

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

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

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

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


person DrEichenbach    schedule 10.01.2019    source источник


Ответы (2)


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

class MyModelForm(...):

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

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

person Daniel Hepper    schedule 10.01.2019

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

person Walucas    schedule 10.01.2019