Django Admin - Nonaktifkan tindakan 'Tambah' untuk model tertentu

147

Saya memiliki situs Django dengan banyak model dan bentuk. Saya memiliki banyak formulir dan formulir kustom serta inlineforms dan validasi kustom serta queryset kustom. Oleh karena itu tindakan menambahkan model tergantung pada formulir yang membutuhkan hal-hal lain, dan 'menambah model' di admin Django melalui 500 dari queryset kustom.

Apakah ada cara untuk menonaktifkan fungsionalitas 'Tambah $ MODEL' untuk model tertentu?

Saya ingin /admin/appname/modelname/add/memberikan 404 (atau pesan kesalahan 'pergi' yang sesuai), saya tidak ingin tombol 'Tambah $ MODELNAME' ada di /admin/appname/modelnametampilan.

Admin Django menyediakan cara untuk menonaktifkan tindakan admin (http://docs.djangoproject.com/en/dev/ref/contrib/admin/actions/#disabling-actions) namun satu-satunya tindakan untuk model ini adalah 'delete_selected'. yaitu tindakan admin hanya bertindak pada model yang ada. Apakah ada cara jango-esque untuk melakukan ini?

Rory
sumber
FYI: 'tindakan' di django admin adalah drop-down yang berlaku dalam tampilan daftar perubahan untuk setiap baris yang dicentang dalam daftar.
Tim Diggins
1
Pertanyaan terkait (tetapi berbeda): stackoverflow.com/questions/1721037/…
user9876

Jawaban:

342

Mudah, cukup dengan has_add_permissionmetode overload di Adminkelas Anda seperti ini:

class MyAdmin(admin.ModelAdmin):
     def has_add_permission(self, request, obj=None):
        return False
Frost.baka
sumber
7
Ini tidak berhasil untuk saya. Tombol "Add model" masih muncul di halaman daftar perubahan model.
Cerin
apa MyAdmin di sini?
user5319825
1
Jangan lupa juga mendaftar MyAdmin seperti: admin.site.register(MyModel, MyModelAdmin)Tambahkan semua ke dalam admin.pyfolder aplikasi model.
djangonaut
Dan inilah mengapa saya sangat mencintai Python & Django. Sederhana. Bekerja dengan baik. Terima kasih!
dxhans5
2
Bekerja di Django 1.11. Tidak perlu objparameter.
fjsj
9

Secara default syncdb menciptakan 3 izin keamanan untuk setiap model:

  1. Buat (alias tambahkan)
  2. Perubahan
  3. Menghapus

Jika Anda masuk sebagai Admin, Anda mendapatkan SEMUANYA apa pun yang terjadi.

Tetapi jika Anda membuat grup pengguna baru yang disebut "Akses Umum" (misalnya) maka Anda dapat menetapkan HANYA izin GANTI dan HAPUS untuk semua model Anda.

Maka setiap pengguna yang masuk yang merupakan anggota grup itu tidak akan memiliki izin "Buat", tidak ada yang terkait dengan itu akan ditampilkan di layar.

Richard Cooke
sumber
7

Saya pikir ini akan membantu Anda .. kode di bawah ini harus dalam file 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

Selain itu di atas seperti yang diposting oleh

    # This will help you to disable change functionality
    def has_change_permission(self, request, obj=None):
        return False
Sandeep Prasad Kushwaha
sumber
Ini bekerja dengan 2.2. dan juga akan menghapus tombol tambah dan hapus untuk pengguna super. Apa yang saya butuhkan.
Erik Kalkoken
2

Cukup salin kode dari jawaban lain

# 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

Dalam kasus saya, saya menggunakan 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

in service = formset.form.base_fields['service'] base_fieldsadalah bidang yang didefinisikan dalam model

jika didefinisikan dalam bentuk gunakan:

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

Lihat juga

CK
sumber
Ya, base_fieldsdan declared_fieldstemuan terpenting yang saya pelajari dari kasus ini.
CK
0

Ini adalah jawaban yang terlalu lama tertunda; Hanya memposting ini seolah-olah ada orang yang menemukan solusi yang sama.

Dalam file admin.py Anda dapat melakukan hal berikut:

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)

Di sini, "readonly_fields" melakukan keajaiban. Terima kasih.

Mohammad
sumber
4
Ini tidak mencegah tombol "tambah" muncul.
Flimm
Solusi ini hanya akan membuat bidang judul dan berat dinonaktifkan di formulir. Itu tidak akan mencegah penciptaan objek MyModelAdmin baru, yang saya percaya OP meminta.
dxhans5