Сделать немодельное поле отключенным или доступным для чтения в админке 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, проверяя там пользовательские разрешения и возвращая свою форму. Я не знаю наверняка, что это хороший способ, но в моем случае он сработал)

Вернуться на верх