использование метода get_context_data () для получения списка зависимых объектов в DetailView Django - PullRequest
0 голосов
/ 16 апреля 2020

Я создаю простое приложение для автосалона в Django 3, в котором при переходе на страницу сведений о категории в нем должны быть перечислены все автомобили, принадлежащие этой категории, поэтому в моем случае объекты автомобилей являются зависимыми объектами соответствующей категории. , Я пытался реализовать это, используя метод get_context_data () и ссылаясь на две соответствующие модели в DetailView, вот мой код

models.py категория

from django.db import models

from django.urls import reverse

# Create your models here.


class Category(models.Model):
    name = models.CharField(null=False, blank=False, max_length=20)
    description = models.TextField(null=False, blank=False, max_length=120)
    image = models.ImageField(upload_to='images/')

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('category_detail', args=[str(self.id)])

models.py cars

from django.db import models

from django.urls import reverse

from categories.models import Category

# Create your models here.


class Car(models.Model):
    image = models.ImageField(upload_to='images/cars/')
    make = models.CharField(null=False, blank=False, max_length=30)
    model = models.CharField(null=False, blank=False, max_length=30)
    year = models.IntegerField(null=False, blank=False)
    transmission = models.CharField(null=False, blank=False, max_length=30)
    category = models.ForeignKey(Category, on_delete=models.CASCADE)

    def __str__(self):
        return self.model

    def get_absolute_url(self):
        return reverse('car_detail', args=[str(self.id)])

просмотры категорий

from django.shortcuts import render

from django.views.generic import ListView, DetailView

from .models import Category
from cars.models import Car
# Create your views here.


class CategoryList(ListView):
    model = Category
    template_name = 'category_list.html'


class CategoryDetailView(DetailView):
    model = Category
    template_name = 'category_detail.html'

    def get_context_data(self, *args, **kwargs):
        context = super(CategoryDetailView, self).get_context_data(
            *args, **kwargs)
        context['category_cars'] = Car.objects.filter(
            category=self.request.name)
        return context

ссылки категорий

from django.urls import path

from .views import CategoryList, CategoryDetailView

urlpatterns = [
    path('categories/', CategoryList.as_view(), name='categories'),
    path('categories/<int:pk>/', CategoryDetailView.as_view(), name='category_detail')
]

, поэтому использование моей вышеописанной реализации приводит к ошибке

enter image description here

какие-либо предложения для достижения желаемой функциональности?

1 Ответ

1 голос
/ 16 апреля 2020

Параметры передаются через kwargs также ваше имя параметра pk, а не name

def get_context_data(self, *args, **kwargs):
    context = super(CategoryDetailView, self).get_context_data(
        *args, **kwargs)
    context['category_cars'] = Car.objects.filter(
        category=context['object']
    )
    return context

Но вы на самом деле этого не делаете Это необходимо сделать, поскольку объекты категории имеют доступ к своим связанным объектам автомобилей (car_set):

{% for car in object.car_set.all %}
   {{car.make}}
{% endfor %}
...