Подтвердить что ты не робот

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

У меня есть сайт django с большим количеством моделей и форм. У меня есть множество настраиваемых форм и форм, а также встроенные формы и пользовательские проверки и пользовательские запросы. Следовательно, действие add model зависит от форм, которым нужны другие вещи, и "add model" в admin django через 500 из пользовательского набора запросов.

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

  • Создать (ака добавить)
  • Изменить
  • Удалить

Если вы вошли в систему под именем Admin, вы получите ВСЕ, независимо от того, что.

Но если вы создаете новую группу пользователей с именем "Общий доступ" (например), вы можете назначить ТОЛЬКО разрешения CHANGE и DELETE для всех ваших моделей.

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

Ответ 3

Я думаю, что это поможет вам.. приведенный ниже код должен быть в файле 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

Ответ 4

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

# 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

В моем случае я использую встроенный

# 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']

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

Ответ 5

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

В файле 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 делает магию. Благодарю.