Django的抽象基类管理员? [英] django admin for abstract base class?

查看:122
本文介绍了Django的抽象基类管理员?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我有汽车-suv /公共汽车模型。

Suppose I have car - suv/bus models.

我想在django管理员(具有名称属性)中列出所有汽车。

当用户单击其中一辆汽车时,它将转到suv或公共汽车模型的相应详细信息页面。

I'd like to list all cars in the django admin (with name attribute).
When user clicks one of the car, it would go to the appropriate detail page of either suv or bus model.

如何创建这样的管理员列表页面?

How do I create a such admin list page?

class Car:

    name = models.CharField()

    class Meta:
        abstract=True


class Suv(Car):

    pass

class Bus(Car):

    pass


推荐答案

不确定这是否是最好的方法,但请在此处共享我的解决方案。

Not sure this is the best approach, but sharing my solution here.

首先,创建一个数据库视图

First, create a Database View

create view [app_label_model_name] as

select id, name, 1 as car_type
from suv
union
select id, name, 2 as car_type
from bus
order by something;

然后创建非托管模型

 class PostBaseView(models.Model):
     # this would be CarBaseView, I'm copying my actual code
     id = models.IntegerField()
     raw_html = models.TextField(null=True)
     created_at = models.DateTimeField(primary_key=True)
     post_type = models.IntegerField()

     class Meta:
         managed = False

然后,从管理页面更改基于子类类型的链接。

then, from admin page, change the links based on subclass types.

 class ChangeList(ChangeListDefault):

     def url_for_result(self, result):
         # pk = getattr(result, self.pk_attname)
         id = result.id

         app_label = result.get_app_label()
         model_name = result.get_model_name()

         return reverse('admin:%s_%s_change' % (app_label,
                                                model_name),
                        args=(quote(id),))


 class PostBaseViewAdmin(admin.ModelAdmin):

     list_display = ['__str__', 'post_type_str']

     class Meta:
         model = PostBaseView

     def get_changelist(self, request, **kwargs):
         """
         Returns the ChangeList class for use on the changelist page.
         """
         return ChangeList

 admin.site.register(PostBaseView, PostBaseViewAdmin)

volla,您有一个管理员可以在一个列表中显示多个子类。

volla you have a admin that shows multiple subclasses at one list.

这篇关于Django的抽象基类管理员?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆