Я пытаюсь написать приложение для Django и испытываю трудности с настройкой администратора для одной из моих моделей.
Вот упрощенная версия модели, с которой я работаю:
class Server(django.db.models.Model):
name = django.db.models.CharField(max_length=40)
is_virtual = django.db.models.BooleanField()
host = django.db.models.ForeignKey(u'self', blank=True, null=True)
Вот форма, которую я пытаюсь привязать к администратору:
class ServerAdminForm(forms.ModelForm):
class Meta:
model = models.Server
def __init__(self, *args, **kwargs):
super(ServerAdminForm, self).__init__(*args, **kwargs)
if not self.instance.is_virtual:
# I don't know why these are not working
self.fields['host'].widget.attrs['disabled'] = 'disabled'
self.fields['host'].widget.attrs['readonly'] = True
А вот код администратора (на самом деле есть больше полей и других наборов полей):
class ServerAdmin(admin.ModelAdmin):
fieldsets = (
(None, {
'fields': ('name', 'is_virtual', 'host')
}),
)
form = admin_forms.ServerAdminForm
save_as = True
Моя цель - заставить администратора показывать поле хоста только тогда, когда is_virtual равен True.Я попытался удалить host из полей и установить его в none в форме init выше, но оба из них привели к сбою страницы, потому что я указал его в наборах полей.
Итак, мой первый вопрос: есть ли чистый способ динамически изменять наборы полей на основе экземпляра?Я пробовал этот подход в течение нескольких часов, но нигде не нашел Google и документации Django.
После неудачи с вышеуказанным подходом я решил попытаться отключить ModelChoiceField, когда is_virtual равен False.Это код формы, который у меня есть выше.Когда я шагаю по коду, кажется, что все настроено правильно, но когда я смотрю на источник html, я не вижу атрибутов disabled или readonly.Я попытался переключить хост на CharField, чтобы увидеть, изменилось ли это что-нибудь, и когда я посмотрел HTML, атрибуты были установлены.
Я не уверен, что в документации что-то отсутствует, говоря о том, что вы не можете отключить ModelChoiceFields, или я просто делаю что-то не так, но я был бы признателен за любые советы о том, как отключить ModelChoiceField.
Поэтому я ищу либо способ динамического изменения наборов полей в зависимости от экземпляра, либо способ отключения ModelChoiceField.Я также открыт для других подходов к решению этой проблемы, если вы думаете, что есть лучший способ сделать это.
Заранее благодарен за любую помощь.
Обновление
Мне удалось получить желаемые результаты, используя подход javascript из выбранного ответа.
Мне все же любопытно, почему подход, который я использовал, используя self.fields ['host']. Widget.attrs, не работал для ModelChoiceField.