ผู้ดูแลระบบ Django - ปิดการใช้งานการกระทำ 'เพิ่ม' สำหรับรุ่นเฉพาะ


147

ฉันมีไซต์ django พร้อมโมเดลและฟอร์มมากมาย ฉันมีฟอร์มและฟอร์มที่กำหนดเองจำนวนมากและชุดรูปแบบอินไลน์และการตรวจสอบความถูกต้องที่กำหนดเองและแบบสอบถามที่กำหนดเอง ดังนั้นการดำเนินการเพิ่มรูปแบบขึ้นอยู่กับรูปแบบที่ต้องการสิ่งอื่น ๆ และ 'เพิ่มรูปแบบ' ในผู้ดูแลระบบ 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-esque บ้างไหม?


FYI: 'การกระทำ' ในผู้ดูแลระบบ django คือรายการแบบหล่นลงที่ใช้ในมุมมองรายการการเปลี่ยนแปลงกับแถวที่เลือกในรายการ
ทิม Diggins

1
คำถามที่เกี่ยวข้อง (แต่แตกต่างกัน): stackoverflow.com/questions/1721037/…
9876

คำตอบ:


342

มันง่ายเพียงแค่โอเวอร์โหลดhas_add_permissionในAdminชั้นเรียนของคุณเช่น:

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

7
สิ่งนี้ไม่ได้ผลสำหรับฉัน ปุ่ม "เพิ่มรุ่น" ยังคงปรากฏบนหน้ารายการเปลี่ยนแปลงของรุ่น
Cerin

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. สร้าง (aka เพิ่ม)
  2. เปลี่ยนแปลง
  3. ลบ

หากคุณเข้าสู่ระบบในฐานะผู้ดูแลคุณจะได้รับ ทุกสิ่งไม่ว่าจะเกิดอะไรขึ้น

แต่ถ้าคุณสร้างกลุ่มผู้ใช้ใหม่ที่เรียกว่า"การเข้าถึงทั่วไป" (ตัวอย่าง)คุณสามารถกำหนดสิทธิ์ CHANGE และ DELETE ได้เฉพาะรุ่นของคุณเท่านั้น

จากนั้นผู้ใช้ที่เข้าสู่ระบบซึ่งเป็นสมาชิกของกลุ่มนั้นจะไม่ได้รับอนุญาต "สร้าง" ไม่มีอะไรเกี่ยวข้องกับมันจะปรากฏบนหน้าจอ


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

ใน additon ไปด้านบนตามที่โพสต์โดย

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

ใช้งานได้กับ 2.2 และจะลบปุ่มเพิ่มและลบสำหรับ superusers สิ่งที่ฉันต้องการ
Erik Kalkoken

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

ในกรณีของฉันฉันใช้แบบอินไลน์

# 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

in 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.