@Kinolog16

Как починить ссылку на объекты модели в админке?

В админке Django, создал ссылку на листинг с объектами модели. Но по ссылке открываются не объекты конкретного id, а все объекты в модели. И итоговый URL формата /admin/management/timetask/?e=1, хотя ссылка корректная /admin/management/timetask/?ProjectWorkPlan__id=45, например.

При этом, этот же код работает нормально в другой модели. Подскажите пожалуйста где ошибка.

Стек: Django 4.2.3, PostgreSQL 14.9

models.py
class ProjectWorkPlan(models.Model):
    class Status(models.TextChoices):
        PLANNED = 'PL', 'Запланирована'
        IN_WORK = 'WO', 'В работе'
        COMPLETED = 'CO', 'Выполненна'

    status_task = models.CharField(max_length=2,
                                   choices=Status.choices,
                                   default=Status.PLANNED, verbose_name='статус')
    project = models.ForeignKey(Project, on_delete=models.CASCADE, verbose_name='Проект')
    tasklist = models.ForeignKey(Tasklist, on_delete=models.SET_NULL, verbose_name="список задач", null=True)
    name_task = models.CharField('название', max_length=255)
    description_task = models.TextField('описание', blank=True)
    link_to_crm = models.URLField('URL задачи в CRM', blank=True, null=True)
    exact_frequency = models.IntegerField('частотность URL', blank=True, null=True)
    growth_forecast = models.CharField('прогноз роста', max_length=255, blank=True)
    job_url = models.URLField('URL страницы', blank=True, null=True)
    priority = models.CharField('приоритетность', max_length=255, blank=True)

class TimeTask(models.Model):
    task = models.ForeignKey(ProjectWorkPlan, on_delete=models.CASCADE, verbose_name='Задача')
    time_task_date = models.DateField('дата создания', auto_now_add=True)
    time = models.DurationField('Затраченное время')

admin.py
@admin.register(ProjectWorkPlan)
class ProjectWorkPlanAdmin(admin.ModelAdmin):
    search_fields = ("name_task",)
    list_display = ("name_task", "tasklist", "priority", "status_task", "view_time")
    list_filter = ("status_task", "tasklist", "priority")

    def view_time(self, obj):
        count = obj.timetask_set.count()
        url = (
                reverse("admin:management_timetask_changelist")
                + "?"
                + urlencode({"ProjectWorkPlan__id": f"{obj.id}"})
        )
        if count:
            return format_html('<p><a href="{}">{}</a></p>', url, count)
        else:
            return format_html('<p>0</p>')


    view_time.short_description = "Затраченное время"

@admin.register(TimeTask)
class TimeTask(admin.ModelAdmin):
    list_display = ("time", "time_task_date", "task")
  • Вопрос задан
  • 53 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы