Как заставить администратора Django «Сохранить как новый» работать с полями только для чтения? - PullRequest
0 голосов
/ 09 апреля 2019

Я хочу реализовать функцию «Сохранить как новый» в админке Django для такой модели, как эта:

class Plasmid (models.Model):
    name = models.CharField("Name", max_length = 255, blank=False)
    other_name = models.CharField("Other Name", max_length = 255, blank=True)
    selection = models.CharField("Selection", max_length = 50, blank=False)
    created_by = models.ForeignKey(User)

В админке, если пользователь, который запрашивает объект Plasmid, НЕ является тем жекак тот, кто его создал, некоторые из показанных выше полей установлены только для чтения.Если пользователь один и тот же, они все доступны для редактирования.Например:

class PlasmidPage(admin.ModelAdmin):

    def get_readonly_fields(self, request, obj=None):

        if obj:
            if not request.user == obj.created_by:
                return ['name', 'created_by',]
            else:
                return ['created_by',]
        else:
            return []

    def change_view(self,request,object_id,extra_context=None):

        self.fields = ('name', 'other_name', 'selection', 'created_by',)
        return super(PlasmidPage,self).change_view(request,object_id)

У меня проблема в том, что когда поле доступно только для чтения и пользователь нажимает кнопку «Сохранить как новое», значение этого поля не «переносится» в новоеобъект.С другой стороны, передаются значения полей, которые не только для чтения.

Кто-нибудь почему или как я мог решить эту проблему?Я хочу перенести значения полей только для чтения и не только для чтения в новый объект.

1 Ответ

0 голосов
/ 10 апреля 2019

Вы пробовали атрибут Field.disabled ?

Если для логического аргумента disabled установлено значение True, отключается поле формы с использованием отключенного атрибута HTML, поэтому он выигрывает 'быть редактируемым пользователями.Даже если пользователь подделает значение поля, отправленное на сервер, оно будет игнорироваться в пользу значения из исходных данных формы.

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


class PlasmidPage(admin.ModelAdmin):

    def get_form(self, request, *args, **kwargs):
        form = super(PlasmidPage, self).get_form(request, *args, **kwargs)
        if not request.user == self.cleaned_data['created_by'].:
            form.base_fields['created_by'].disabled = True
            form.base_fields['name'].disabled = True

    def change_view(self,request,object_id,extra_context=None):

        self.fields = ('name', 'other_name', 'selection', 'created_by',)
        return super(PlasmidPage,self).change_view(request,object_id)

...