Django Admin - Vô hiệu hóa hành động 'Thêm' cho một kiểu máy cụ thể


146

Tôi có một trang web django với rất nhiều mô hình và hình thức. Tôi có nhiều biểu mẫu và biểu mẫu tùy chỉnh và biểu mẫu nội tuyến và xác thực tùy chỉnh và truy vấn tùy chỉnh. Do đó, hành động thêm mô hình phụ thuộc vào các biểu mẫu cần những thứ khác và 'mô hình thêm' trong quản trị viên django thông qua 500 từ bộ truy vấn tùy chỉnh.

Có cách nào để tắt chức năng 'Thêm $ MODEL' cho một số kiểu máy nhất định không?

Tôi muốn /admin/appname/modelname/add/cung cấp 404 (hoặc thông báo lỗi 'biến mất' phù hợp), tôi không muốn nút 'Thêm $ MODELNAME' được /admin/appname/modelnamexem.

Quản trị viên Django cung cấp một cách để vô hiệu hóa các hành động của quản trị viên (http://docs.djangoproject.com/en/dev/ref/contrib/admin/ilities/#diseac-ilities) tuy nhiên hành động duy nhất cho mô hình này là 'xóa_selected'. tức là các hành động quản trị chỉ hành động trên các mô hình hiện có. Có một số cách django-esque để làm điều này?


FYI: 'hành động' trong quản trị viên django là trình đơn thả xuống áp dụng trong chế độ xem thay đổi cho bất kỳ hàng nào được kiểm tra trong danh sách.
Tim Diggins

1
Câu hỏi liên quan (nhưng khác nhau): stackoverflow.com/questions/1721037/ từ
user9876

Câu trả lời:


341

Thật dễ dàng, chỉ là quá tải has_add_permission phương thức trong Adminlớp của bạn như vậy:

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

7
Điều này đã không làm việc cho tôi. Nút "Thêm mô hình" vẫn hiển thị trên trang thay đổi của mô hình.
Cerin

MyAdmin ở đây là gì?
user5319825

1
Đừng quên đăng ký MyAdmin như sau: admin.site.register(MyModel, MyModelAdmin)Thêm tất cả vào admin.pythư mục ứng dụng của các mô hình.
djangonaut

Và đây chính xác là lý do tại sao tôi yêu Python & Django rất nhiều. Đơn giản. Làm việc tuyệt vời. Cảm ơn bạn!
dxhans5

2
Hoạt động tại Django 1.11. Không cần objtham số.
fjsj

9

Theo mặc định syncdb tạo 3 quyền bảo mật cho mỗi mô hình:

  1. Tạo (còn gọi là thêm)
  2. Thay đổi
  3. Xóa bỏ

Nếu bạn đăng nhập với tư cách Quản trị viên, bạn sẽ nhận được MỌI THỨ không có vấn đề gì.

Nhưng nếu bạn tạo một nhóm người dùng mới gọi là "Truy cập chung" (ví dụ) thì bạn có thể gán CHỈ các quyền THAY ĐỔI và XÓA cho tất cả các mô hình của mình.

Sau đó, bất kỳ người dùng nào đã đăng nhập là thành viên của nhóm đó sẽ không có quyền "Tạo", không có gì liên quan đến nó sẽ hiển thị trên màn hình.


7

Tôi nghĩ rằng điều này sẽ giúp bạn .. mã bên dưới phải có trong tệp 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

Ngoài ra như trên được đăng bởi

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

Điều này hoạt động với 2.2. và cũng sẽ loại bỏ các nút thêm và loại bỏ cho siêu nhân. Chính xác những gì tôi cần.
Erik Kalkoken

2

Chỉ cần sao chép mã từ một câu trả lời khác

# 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

Trong trường hợp của tôi, tôi sử dụng nội tuyến

# 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

trong service = formset.form.base_fields['service'] base_fieldslà các trường được xác định trong mô hình

nếu được định nghĩa trong biểu mẫu sử dụng:

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

Xem thêm


Vâng, base_fieldsdeclared_fieldslà phát hiện quan trọng nhất tôi học được từ trường hợp này.
CK

0

Đây là một câu trả lời quá chậm trễ; Chỉ cần đăng bài này như thể bất cứ ai đang tìm giải pháp tương tự.

Trong tệp admin.py bạn có thể làm như sau:

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)

Ở đây, "readonly_fields" thực hiện phép thuật. Cảm ơn.


4
Điều này không ngăn nút "thêm" xuất hiện.
Flimm

Giải pháp này đơn giản sẽ làm cho tiêu đề và trường trọng lượng bị vô hiệu hóa trên biểu mẫu. Nó sẽ không ngăn cản việc tạo ra một đối tượng MyModelAdmin mới, đó là điều mà tôi tin rằng OP đã yêu cầu.
dxhans5
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.