SORU
8 ŞUBAT 2010, PAZARTESİ


Birden fazla Django admin aynı model için/görüş ModelAdmins

Nasıl aynı model için birden fazla ModelAdmin, farklı özel ve farklı bir URL ile bağlantılı her oluşturabilirim?

Hadi Django modeli Mesaj denilen var. Varsayılan olarak, bu modelin yönetim görünüme Sonrası tüm nesneleri listeler.

List_display gibi değişkenleri ayarlamak veya benim ModelAdmin queryset yöntem geçersiz kılma nesneleri çeşitli şekillerde sayfasında görüntülenen listesi gibi özelleştirin biliyorum:

class MyPostAdmin(admin.ModelAdmin):
    list_display = ('title', 'pub_date')

    def queryset(self, request):
        return Post.objects.filter(author=requser.user)

admin.site.register(MyPostAdmin, Post)

Varsayılan olarak, bu URL adresinden erişilebilir /admin/myapp/post olurdu. Ancak birden çok kez aynı model ModelAdmins/istiyorum. e.g /admin/myapp/post post tüm nesnelerin listesini ve /admin/myapp/myposts tüm mesajları kullanıcıya ait liste ve /admin/myapp/draftpost henüz yayınlanmamış tüm mesajları listesi. (bu sadece örnek, durum daha karmaşıktır benim gerçek)

Olamaz aynı model için birden fazla ModelAdmin (AlreadyRegistered özel bir durum bu sonuçları) kaydetmek. İdeal olarak bunu başarmak istiyorumolmadantek ModelAdmin bir sınıf içine her şeyi koymak ve kendi kendime 'URL' farklı bir queryset URL bağlı olarak iade edilebiliyor. yazılı

Django kaynağında bir göz attım ve nasıl olduysa benim dahil olabilir ModelAdmin.changelist_view gibi işlevleri urls.py ama bunun işe yarayacağını tam olarak emin değilim görüyorum.

Güncelleme: İstediğimi yapmanın bir yolu (aşağıya bakınız) buldum, ama yine de bunu yapmanın başka yolları da duymak isterim.

CEVAP
9 ŞUBAT 2010, Salı


Bir şekilde istediğimi elde etmek için her model sadece bir kez kayıt olabilir, bilgi almak için proxy modeller kullanarak buldum.

class PostAdmin(admin.ModelAdmin):
    list_display = ('title', 'pubdate','user')

class MyPosts(Post):
    class Meta:
        proxy = True

class MyPostAdmin(PostAdmin):
    def queryset(self, request):
        return self.model.objects.filter(user = request.user)


admin.site.register(Post, PostAdmin)
admin.site.register(MyPost, MyPostAdmin)

Varsayılan PostAdmin /admin/uygulamam/post erişilebilir ve mesajları kullanıcıya ait listesi /admin/uygulamam/myposts olacaktır.

http://code.djangoproject.com/wiki/DynamicModels, baktıktan sonra aynı şeyi yapmak için aşağıdaki fonksiyonu yardımcı işlevi ile geldim:

def create_modeladmin(modeladmin, model, name = None):
    class  Meta:
        proxy = True
        app_label = model._meta.app_label

    attrs = {'__module__': '', 'Meta': Meta}

    newmodel = type(name, (model,), attrs)

    admin.site.register(newmodel, modeladmin)
    return modeladmin

Bu aşağıdaki gibi kullanılabilir

class MyPostAdmin(PostAdmin):
    def queryset(self, request):
        return self.model.objects.filter(user = request.user)

create_modeladmin(MyPostAdmin, name='my-posts', model=Post)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Booredatwork.com

    Booredatwork

    5 Ocak 2009
  • hydejiaqi

    hydejiaqi

    12 Mart 2008
  • RyanXLT

    RyanXLT

    22 Ocak 2011