Django Admin - отключить действие «Добавить» для конкретной модели


147

У меня есть сайт Django с множеством моделей и форм. У меня есть много пользовательских форм и наборов форм и наборов inlineform, а также пользовательских проверок и пользовательских наборов запросов. Следовательно, действие добавления модели зависит от форм, которым нужны другие вещи, и «модель добавления» в администраторе django пропускает 500 из пользовательского набора запросов.

Есть ли в любом случае отключить функцию «Добавить $ MODEL» для определенных моделей?

Я хочу /admin/appname/modelname/add/выдать сообщение об ошибке 404 (или подходящее сообщение об отсутствии), я не хочу, чтобы на экране была кнопка «Добавить $ MODELNAME» /admin/appname/modelname.

Администратор Django предоставляет способ отключить действия администратора (http://docs.djangoproject.com/en/dev/ref/contrib/admin/actions/#disabling-actions), однако единственное действие для этой модели - «delete_selected». то есть действия администратора действуют только на существующие модели. Есть ли какой-нибудь джанго-эск способ сделать это?


К сведению: «действия» в django admin - это раскрывающийся список, который применяется в представлении списка изменений ко всем отмеченным строкам в списке.
Тим Диггинс

1
Связанный (но другой) вопрос: stackoverflow.com/questions/1721037/…
user9876

Ответы:


342

Это просто, просто перегрузите has_add_permissionметод в вашем Adminклассе следующим образом:

class MyAdmin(admin.ModelAdmin):
     def has_add_permission(self, request, obj=None):
        return False

7
Это не сработало для меня. Кнопка «Добавить модель» по-прежнему отображается на странице списка изменений модели.
Церин

что такое MyAdmin здесь?
user5319825 15.09.16

1
Не забудьте также зарегистрировать MyAdmin как: admin.site.register(MyModel, MyModelAdmin)Добавить все в admin.pyпапку приложения моделей.
Джангонавт

И именно поэтому я так люблю Python & Django. Просто. Работал отлично. Спасибо!
dxhans5

2
Работает на Джанго 1.11. Нет необходимости в objпараметре.
FJSJ

9

По умолчанию syncdb создает 3 разрешения безопасности для каждой модели:

  1. Создать (иначе добавить)
  2. + Изменить
  3. Удалить

Если вы вошли в систему как администратор, вы получите ВСЕ, несмотря ни на что.

Но если вы создаете новую группу пользователей под названием «Общий доступ» (например), вы можете назначить ТОЛЬКО разрешения ИЗМЕНИТЬ и УДАЛИТЬ для всех ваших моделей.

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


7

Я думаю, что это поможет вам .. ниже код должен быть в файле admin.py

@admin.register(Author)
class AuthorAdmin(admin.ModelAdmin):
    list_display = ('name', )
    list_filter = ('name', )
    search_fields = ('name', )
    list_per_page = 20

    # This will help you to disbale add functionality
    def has_add_permission(self, request):
        return False

    # This will help you to disable delete functionaliyt
    def has_delete_permission(self, request, obj=None):
        return False

В дополнение к вышесказанному, как опубликовано

    # This will help you to disable change functionality
    def has_change_permission(self, request, obj=None):
        return False

Это работает с 2.2. а также удалит кнопки добавления и удаления для суперпользователей. Именно то, что мне нужно.
Эрик Калкокен

2

Просто скопируйте код из другого ответа

# In admin
# make the related field can't be added
    def get_form(self, request, obj=None, **kwargs):
        form = super().get_form(request, obj, **kwargs)
        form.base_fields['service'].widget.can_add_related = False
        return form

В моем случае я использую inline

# In inline formset e.g. admin.TabularInline
# disable all
    def get_formset(self, request, obj=None, **kwargs):
        formset = super().get_formset(request, obj, **kwargs)
        service = formset.form.base_fields['service']
        service.widget.can_add_related = service.widget.can_change_related = service.widget.can_delete_related = False
        return formset

в service = formset.form.base_fields['service'] base_fieldsэто поля, определенные в модели

если определено в форме, используйте:

product = formset.form.declared_fields['product']

смотрите также


Да, base_fieldsи declared_fieldsэто самое важное, что я узнал из этого дела.
CK

0

Это слишком запоздалый ответ; Просто разместите это, как будто кто-то находит то же самое решение.

В файле admin.py вы можете сделать следующее:

class MyModelForm(forms.ModelForm):

class Meta:
    model = MyModel
    fields = '__all__'


class MyModelAdmin(admin.ModelAdmin):
    form = QuestionTrackAdminForm
    list_display = ['title', 'weight']
    readonly_fields = ['title', 'weight']

admin.site.register(MyModel, MyModelAdmin)

Здесь «readonly_fields» делает волшебство. Спасибо.


4
Это не мешает появлению кнопки «Добавить».
Flimm

Это решение просто отключит поля заголовка и веса в форме. Это не помешает созданию нового объекта MyModelAdmin, чего, как я полагаю, запрашивал OP.
dxhans5
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.