【问题标题】:How to show child records for only related parent in django Admin?如何在 django Admin 中仅显示相关父级的子记录?
【发布时间】:2017-03-10 21:49:36
【问题描述】:

模型“Playbook”具有相关的子对象“Activity” 需要在 django admin 中为每个“剧本”对象列出“活动”。 目前 list_display 显示所有 playbook 对象(父对象)的所有活动对象。

django v 1.10.x,python 3.5.x

模型.py

​​>
class PlayBook(TimeStampModel):
    name = models.CharField(max_length=200, unique=True)
    description = models.TextField(blank=True, help_text="Business purpose of the application")
    owner = models.ForeignKey(User, on_delete=models.CASCADE)

    class Meta:
        ordering = ('name',)

    @property
    def short_description(self):
        return truncatechars(self.description, 35)

    def __str__(self):
        return "{}".format(self.name)

class Activity(TimeStampModel):

    minor = 'MINOR'
    normal = 'NORMAL'
    important = 'IMPORTANT'
    critical = 'CRITICAL'

    SEVERITY = (
        (minor, 'Minor'),
        (normal, 'Normal'),
        (important, 'Important'),
        (critical, 'Critical'),
    )

    low = 'LOW'
    high = 'HIGH'
    PRIORITY = (
            (low, 'Low'),
            (normal, 'Normal'),
            (high, 'High'),
            )

    new = 'New'
    in_progress = 'In_Progress'
    needs_info = 'Needs_Info'
    postponed = 'Postponed'
    closed = 'Closed'
    STATUS= (
            (new, 'New'),
            (in_progress, 'In_Progress'),
            (needs_info, 'Needs_Info'),
            (postponed, 'Postponed'),
            (closed, 'Closed'),

            )

    playbook = models.ForeignKey(PlayBook)
    subject = models.CharField(max_length=200, unique=True)
    description = models.TextField(blank=True, help_text="Business purpose of the application")
    manager = models.ForeignKey(User, on_delete=models.CASCADE)
    severity = models.CharField(max_length = 100, choices=SEVERITY, default=normal)
    priority = models.CharField(max_length = 100, choices=PRIORITY, default=normal)
    status = models.CharField(max_length = 100, choices=STATUS, default=new)

    def __str__(self):
        return "{}".format(self.subject)

    class Meta:
        ordering = ('severity',)
    @property
    def short_description(self):
        return truncatechars(self.description, 35)

class ReviewActivity(Activity):
    class Meta:
        proxy=True

    def __str__(self):
        return self.subject.upper()

Admin.py

​​>
class ActivityAdmin(admin.TabularInline):
    list_display =['severity','priority', 'subject', 'status_colored','created','updated', 'short_description']

    def status_colored(self, obj):
        colors = {
            'Closed': '#DCE775',
            'Needs_Info': '#F8BBD0'  ,
            'In_Progress': '#FFCCBC',
            'New':'#81D4FA',
            'Postponed': '#CFD8DC'
        }
        return format_html(
            '<b style="background:{};">{}</b>',
            colors[obj.status],
            obj.status,
        )

class ActivityInline(admin.TabularInline):
    model = Activity
    extra = 1

class PlayBookAdmin(admin.ModelAdmin):

    inlines = [
            ActivityInline,
            ]

    list_display =['name','short_description','created', 'updated','owner',]


class ReviewActivityAdmin(admin.ModelAdmin):

    list_display =['severity','priority', 'subject', 'status_colored','created','updated', 'short_description']

    def status_colored(self, obj):
        colors = {
            'Closed': '#DCE775',
            'Needs_Info': '#F8BBD0'  ,
            'In_Progress': '#FFCCBC',
            'New':'#81D4FA',
            'Postponed': '#CFD8DC'
        }
        return format_html(
            '<b style="background:{};">{}</b>',
            colors[obj.status],
            obj.status,
        )

#admin.site.register(Activity, ActivityAdmin)
admin.site.register(PlayBook, PlayBookAdmin)
admin.site.register(ReviewActivity, ReviewActivityAdmin)

结果:

我尝试使用代理模型。但它仍然显示所有父母的所有孩子记录。

Playbook 链接显示以下内容: playbook1 显示表格显示

问题:

查看活动链接显示所有剧本的所有活动对象。需要显示相关剧本的活动对象。不是所有剧本*。 参见(图 4):

github链接:

Link to source TaskMaster

【问题讨论】:

    标签: django list django-models django-admin display


    【解决方案1】:

    今天早上我遇到了类似的情况,这就是我解决它的方法。我会用你的例子来解释。

    我在 PlayBook 模型中定义了一个名为 activities() 的新方法,如下所示:

    class PlayBook(TimeStampModel):
        name = models.CharField(max_length=200, unique=True)
        owner = models.ForeignKey(User, on_delete=models.CASCADE)
    
        def activities(self):
        qs = self.activity_set.all() # this gets all the child related objects
        for x in qs:
            result = x.subject # here i am just getting one of the fields from the Activities model
        return result
    

    所以现在你可以在你的 admin.py 中设置你的 list_diplay 如下

    class PlayBookAdmin(admin.ModelAdmin):
    
        list_display =['activities',] # This will call the activities() method that your created in the models.py and display the result. 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-12
      • 2016-10-26
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-21
      相关资源
      最近更新 更多