Django Admin - вимкніть дію "Додати" для конкретної моделі


147

У мене є сайт django з великою кількістю моделей та форм. У мене є безліч користувальницьких форм і наборів форматів та вбудованих наборів, а також власна перевірка та спеціальні запити Отже, дія моделі додавання залежить від форм, для яких потрібні інші речі, а "Додати модель" в адміністраторі django через 500 із користувацького набору запитів.

Чи все-таки можна відключити функцію "Додати $ MODEL" для певних моделей?

Я хочу /admin/appname/modelname/add/надіслати повідомлення про помилку 404 (або підходяще повідомлення "відійти"), я не хочу, щоб кнопка "Додати $ MODELNAME" була /admin/appname/modelnameпереглянута.

Адміністратор Django пропонує спосіб відключення дій адміністратора (http://docs.djangoproject.com/en/dev/ref/contrib/admin/action/#disabling-action), однак єдиною дією для цієї моделі є "delete_selected". тобто дії адміністратора діють лише на існуючих моделях. Чи є якийсь спосіб джанго-еске це зробити?


FYI: "дії" в адміністраторі django - це спадне меню, яке застосовується у вигляді переліку змін до будь-яких перевірених рядків у списку.
Тім Діггінс

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

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

І саме тому я так люблю Python & Django. Простий. Працювали чудово. Дякую!
dxhans5

2
Працює на Django 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, про що я вважаю, просив ОП.
dxhans5
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.