Сделать немодельное поле отключенным или доступным для чтения в админке djnago на основе условия
У меня есть модель, админка и форма для нее. Но в моей форме есть поле, которого нет в модели, и я делаю некоторые пользовательские действия с этим полем.
Я хочу, чтобы это поле было доступно для чтения, скрыто или отключено для пользователей без определенных прав, но django не позволяет мне динамически устанавливать любые из этих атрибутов.
Моя модель:
class PromocodePool(TimeStampedModel):
start = models.DateTimeField()
end = models.DateTimeField(null=True, blank=True)
Форма:
class PromocodePoolForm(forms.ModelForm):
promocodes = forms.FileField(widget=AdminFileWidget, required=False) # this field is non-model
class Meta:
model = PromocodePool
fields = '__all__'
Admin:
@admin.register(PromocodePool)
class PromocodePoolAdmin(admin.ModelAdmin):
form = PromocodePoolForm
list_display = ("get_start", "get_end")
readonly_fields = (<some fields, tuple>)
@admin.display(description="Start date")
def get_start(self, obj):
return _date(obj.start, formats.DATE_FORMAT)
@admin.display(description="Start date")
def get_end(self, obj):
return _date(obj.end, formats.DATE_FORMAT)
def get_readonly_fields(self, request, obj=None):
if not request.user.has_perm("promocode.custom_permission"):
self.readonly_fields += ("promocodes",) # this doesn't work
return self.readonly_fields
Я получаю эту ошибку:
Unable to lookup 'promocodes' on PromocodePool or PromocodePoolAdmin or PromocodePoolForm
Btw если я переименую свою форму, текст ошибки останется прежним, потому что настоящая "готовая" форма генерируется через метакласс ModelFormMetaclass от django и называется PromocodePoolForm и эта форма не является моей формой, описанной выше
Есть ли способ динамически отключить это поле?
Если это имеет значение, я использую python 3.8 и Django 3.2.6
Похоже, что вы можете переопределить метод get_forms, проверяя там пользовательские разрешения и возвращая свою форму. Я не знаю наверняка, что это хороший способ, но в моем случае он сработал)