【问题标题】:using get_context_data() method to retrieve a list of dependant objects within DetailView Django使用 get_context_data() 方法检索 DetailView Django 中的依赖对象列表
【发布时间】:2020-04-16 20:09:07
【问题描述】:

我正在 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 汽车

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')
]

所以使用我上面的实现会导致错误

有什么建议可以实现我想要的功能吗?

【问题讨论】:

    标签: django python-3.x django-views


    【解决方案1】:

    参数通过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
    

    但您实际上不需要这样做,因为 Category 对象可以访问它们的 related Car 对象 (car_set):

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

    【讨论】:

    • 我尝试了您提供的 car_set 解决方案,但得到了这个错误 ``` TypeError at /categories/7/ 'RelatedManager' object is not iterable 请求方法:GET 请求 URL:127.0.0.1:8000/categories/7 Django 版本: 3.0.5 异常类型:TypeError 异常值:'RelatedManager' 对象不可迭代```
    • 即使您的第一个解决方案也因出现类似这样的密钥错误而失败 ``` KeyError at /categories/7/ 'pk' 请求方法:GET 请求 URL:127.0.0.1:8000/categories/7 Django 版本:3.0.5 KeyError 异常值:'pk'```
    • 你能帮忙解决这个问题吗stackoverflow.com/questions/61429442/…
    猜你喜欢
    • 1970-01-01
    • 2017-09-12
    • 1970-01-01
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多