如何在Django管理界面中自定义列表数据视图?

时间:2013-09-13 05:06:34

标签: django django-admin

我的ModelAdmin中有两个admin.py,如下所示:

class ProjectAdmin(admin.ModelAdmin):
    list_display = ('project_name', 'start_date', 'end_date')
    list_filter = ['end_date']
    search_fields = ['project_name']

class TaskAdmin(admin.ModelAdmin):
    list_display = ('project', 'task_name', 'status', 'comment', 'deadline', 'last_updated')
    list_filter = ['last_updated', 'deadline', 'status']
    search_fields = ['project', 'task_name']

此列出项目:

Project Name                          Start_date                 End_date
# Data

但我想自定义看起来像这样:

Project Name        Task Name                       Deadline
# Project1            # Task 1 of Project1           # Task 1 Deadline
                      # Task 2 of project 1             # Deadline
                      # Task 3 of project 1             # Deadline

# Project 2           # Task 1 of project 2           # Deadline

and so on. 

我该怎么做?文档中是否包含这样的内容?我做了一个快速搜索,但找不到正确的指针继续。

由于

1 个答案:

答案 0 :(得分:1)

您必须构建自己的视图并将其添加到管理员。 也许admin list_view是一个很好的起点。

如果这听起来太多了,我可以想象三种解决方法:

  1. 为每个任务和每个截止日期创建一个新列,并在那里添加任务和处理,如“task_taskname”等。当然,如果您在每个项目中有两个或三个任务,那么这将是太多的信息。 / LI>
  2. 扭转你的逻辑!不要为项目创建list_view,而是为任务创建!您仍然可以将项目名称添加到此列表中。实际上,这是您当前的TaskAdmin。
  3. 使用模型函数生成任务名称和截止日期的委托。另外,请提供get_all_tasks.short_description = 'Task Name'之类的简短说明。那应该是诀窍!
  4. 有趣的是,你的问题可能在我的大脑中触发了一些东西,我为自己的项目做了一些非常相似的事情。 您可以通过定义提供内容的功能来解决您的问题(请参阅上面的选项3.):

    class ProjectAdmin(admin.ModelAdmin):
        list_display = ('project_name', 'project_tasks', 'task_deadlines', 'end_date')
        list_filter = ['end_date']
        search_fields = ['project_name']
    
        def project_tasks(self, instance):
             out = ""
             for task in instance.task_set.all(): 
                 #generate html output
                 out += "{0}<br />".format(task.taskname)
             return out
        project_tasks.allow_tags = True #html should be renderd as is
        project_tasks.short_description = "Task Name"
    
        #Same for Deadline
    

    这应该可以做到!

    this is how it looks like in my application