Django - От линейного к списочному отображению
Для кода ниже я хотел бы отобразить последние 10 задач (TaskInline) в UserAdmin и иметь кнопку под этими 10 задачами (inline), которая приведет к TaskAdmin с задачами, отфильтрованными пользователем.
from django.contrib import admin
from django.contrib.auth.models import User
from django.db import models
class Task(models.Model):
title = models.CharField(max_length=50)
description = models.TextField()
performer = models.ForeignKey(User, on_delete=models.CASCADE)
class TaskInline(admin.TabularInline):
max_num = 10 # display last 10 tasks
@admin.register(User)
class UserAdmin(admin.ModelAdmin):
inlines = TaskInline,
@admin.register(Task)
class TaskAdmin(admin.ModelAdmin):
list_filter = 'performer',
Как я могу это сделать? Должен ли я изменить шаблон для TaskInline?
Для создания табличных строк можно использовать следующий код:
class TaskInline(admin.TabularInline):
model = Task
extra = 1
def get_queryset(self):
qs = Task.objects.filter(user=self.request.user)
@admin.register(User)
class UserAdmin(admin.ModelAdmin):
list_display = ['id', 'name', ...]
inlines = (TaskInline,)
Примечание: вам не хватает поля user в Task.
Переписать шаблон change_form.html и добавить
{% block inline_field_sets %}
{{ block.super }}
<a href="{% url 'admin:YOURAPP_task_changelist' %}?user__id__exact={{ object_id }}">View all tasks</a>
{% endblock %}
В случае необходимости, вот как перезаписать ваш шаблон только для User
Создайте html файл YOURAPP/templates/admin/YOURAPP/User/change_form.html и добавьте
{% extends "admin/change_form.html" %}
{% load i18n admin_urls %}
{% block object-tools-items %}
{% block inline_field_sets %}
{{ block.super }}
<a href="{% url 'admin:YOURAPP_task_changelist' %}?user__id__exact={{ object_id }}">View all tasks</a>
{% endblock %}
Тогда ваш UserAdmin будет выглядеть следующим образом
@admin.register(User)
class UserAdmin(admin.ModelAdmin):
inlines = TaskInline,
change_form_template = 'admin/YOURAPP/User/change_form.html'