Django Admin - Belirli bir model için 'Ekle' eylemini devre dışı bırakın


152

Pek çok model ve form içeren bir django sitem var. Birçok özel formum ve form setim ve satır içi form setim ve özel doğrulama ve özel sorgu setim var. Bu nedenle, model ekleme eylemi, başka şeylere ihtiyaç duyan formlara bağlıdır ve django yöneticisindeki 'model ekle', özel bir sorgu kümesinden 500'e kadar.

Belirli modeller için '$ MODEL Ekle' işlevini devre dışı bırakmanın bir yolu var mı?

İstediğim /admin/appname/modelname/add/vermek için 404 (veya uygun hata mesajı 'gitmek'), ben '$ ModelAdı ekle' butonunu olmak istemiyoruz/admin/appname/modelname görünümü.

Django admin, yönetici eylemlerini devre dışı bırakmak için bir yol sağlar (http://docs.djangoproject.com/en/dev/ref/contrib/admin/actions/#disvertising-actions) ancak bu model için tek eylem 'delete_selected' şeklindedir. yani, yönetici eylemleri yalnızca mevcut modellere göre hareket eder. Bunu yapmanın django benzeri bir yolu var mı?


Bilginize: django admin'deki 'eylemler', değişiklik listesi görünümünde listedeki işaretli satırlara uygulanan açılır listedir.
Tim Diggins

1
İlgili (ancak farklı) soru: stackoverflow.com/questions/1721037/…
user9876

Yanıtlar:


351

Kolaydır has_add_permission, Adminsınıfınızda şu şekilde aşırı yükleme yöntemi :

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

7
Bu benim için işe yaramadı. "Model ekle" düğmesi, modelin değişiklik listesi sayfasında görünmeye devam eder.
Cerin

MyAdmin burada nedir?
user5319825

1
MyAdmin'i şu şekilde kaydetmeyi de unutmayın: admin.site.register(MyModel, MyModelAdmin)Tümünü admin.pymodellerin uygulama klasörüne ekleyin.
djangonaut

İşte bu yüzden Python ve Django'yu bu kadar çok seviyorum. Basit. Harika çalıştı. Teşekkür ederim!
dxhans5

2
Django 1.11'de çalışıyor. objParametreye gerek yok .
fjsj

9

Varsayılan olarak syncdb, her model için 3 güvenlik izni oluşturur:

  1. Oluştur (aka ekle)
  2. Değişiklik
  3. Sil

Yönetici olarak giriş yaptıysanız, ne olursa olsun HER ŞEYİ alırsınız .

Ancak "Genel Erişim" adında yeni bir kullanıcı grubu oluşturursanız (örneğin) , tüm modelleriniz için YALNIZCA DEĞİŞTİRME ve SİLME izinlerini atayabilirsiniz.

Daha sonra o grubun üyesi olan oturum açmış herhangi bir kullanıcının "Oluştur" izni olmayacak, bununla ilgili hiçbir şey ekranda görünmeyecektir.


9

Bunun size yardımcı olacağını düşünüyorum .. aşağıdaki kod admin.py dosyasında olmalıdır

@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

Yukarıdakilere ek olarak gönderen

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

Bu, 2.2 ile çalışır. ve süper kullanıcılar için ekle ve kaldır düğmelerini de kaldırır. Tam olarak ihtiyacım olan şey.
Erik Kalkoken

2

Sadece başka bir cevaptaki kodu kopyalayın

# 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

Benim durumumda satır içi kullanıyorum

# 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

içinde service = formset.form.base_fields['service'] base_fieldsmodelinde tanımlanan alanlar olduğunu

formda tanımlanmışsa şunları kullanın:

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

Ayrıca bakınız


Evet base_fieldsve declared_fieldsbu vakadan öğrendiğim en önemli bulgu bunlar.
CK

0

Bu çok gecikmiş bir cevaptır; Bunu sanki biri aynı çözümü buluyormuş gibi yayınlamak.

Admin.py dosyasında şunları yapabilirsiniz:

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)

Burada "readonly_fields" sihir yapar. Teşekkürler.


4
Bu, "ekle" düğmesinin görünmesini engellemez.
Flimm

Bu çözüm, formdaki başlık ve ağırlık alanlarını devre dışı bırakacaktır. OP'nin istediğine inandığım yeni bir MyModelAdmin nesnesinin oluşturulmasını engellemedi.
dxhans5
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.