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

Я довольно новичок в 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 ответа

Решение

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

class MyModelForm(...):

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

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

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

Другие вопросы по тегам