2016-01-11 115 views
1

假設我有汽車 - suv /巴士模型。django管理員抽象基類?

我想列出所有的汽車在Django管理員(具有名稱屬性)。
當用戶點擊其中一輛車時,它會轉到SUV或公交車型號的相應詳細頁面。

如何創建一個這樣的管理列表頁面?

class Car: 

    name = models.CharField() 

    class Meta: 
     abstract=True 


class Suv(Car): 

    pass 

class Bus(Car): 

    pass 

回答

2

不知道這是最好的方法,但在這裏分享我的解決方案。

首先,創建一個數據庫視圖

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; 

然後創建非manged模型

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 

然後,從管理頁面,更改基於子類型的鏈接。

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你有一個管理員在一個列表中顯示多個子類。

+1

這個答案比我好得多,謝謝! –

+0

這仍然是最好的解決方案嗎? – ratata

0

你需要讓你的Car不是一個抽象的模型,你必須有一些基本表爲您的車輛。

class Car: 
    name = models.CharField() 
    class Meta: 
     abstract = False 

class Suv(Car): 
    pass 

class Bus(Car): 
    pass 

class CarAdmin(admin.ModelAdmin): 
    model = Car 

但是,這裏容易的事情結束。管理員沒有針對您的任務的內置解決方案。我建議你重寫至少CarAdmin.get_form()CarAdmin.get_queryset()方法,但我不確定它們是唯一必須自定義的方法。

0

我認爲this answer是適用的。 ModelAdmin需要知道外鍵項是隻讀的,並且在稱爲readonly_fields的元組中指定。

使用帶我來這裏有問題,我有(models.py):

class Choice(models.Model): 
    question = models.ForeignKey(Question, on_delete=models.CASCADE) 
    choice_text = models.CharField(max_length=200) 
    def __str__(self): 
     return self.choice_text 
class Answer(models.Model):  
    question = models.ForeignKey(Question, on_delete=models.CASCADE) 
    user = models.ForeignKey(User, on_delete=models.CASCADE, default = 1) 
    class Meta: 
     abstract = True 
class Vote(Answer): 
choice = models.ForeignKey(Choice, on_delete=models.CASCADE) 
def answer(self): 
    return self.choice 
def __str__(self): 
    return self.choice.choice_text 

和(admin.py):

class VoteAdmin(admin.ModelAdmin): 
#list_display = ('Answer.question.question_text', 'Answer.User.user_id', 'Choice.choice_text') 
readony_fields = ('question', 'user') 
list_display = ('question', 'user', 'choice') 
fieldsets = [ 
     ('Question', {'fields': ['question']}), 
     ('User', {'fields': ['user']}), 
     ('Vote', {'fields' : ['choice']}), 
     ] 

希望這會證明是有用的,以未來的搜索。