Python 如何在细节视图django中显示多个类别?

Python 如何在细节视图django中显示多个类别?,python,django,django-urls,Python,Django,Django Urls,我在一个Django博客上工作,已经实现了细节页面的分类。我偶然发现了一个问题 我想通过使用多对多字段显示产品的某些类别,我使用以下代码 这是我的model.py文件 from django.db import models from django.urls import reverse # Create your models here. class Category(models.Model): name = models.CharField(max_length=200)

我在一个Django博客上工作,已经实现了细节页面的分类。我偶然发现了一个问题

我想通过使用多对多字段显示产品的某些类别,我使用以下代码

这是我的model.py文件

from django.db import models
from django.urls import reverse

# Create your models here.

class Category(models.Model):
    name = models.CharField(max_length=200)
    slug = models.SlugField(max_length=200, unique=True)
    is_active = models.BooleanField(default=True)

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('myshop:product_list_by_category', args=[self.slug])

class Product(models.Model):
    category = models.ManyToManyField(Category)
    name = models.CharField(max_length=200)
    slug = models.SlugField(max_length=200)
    image = models.ImageField(upload_to='products/%Y/%m/%d', blank=True)
    description = models.TextField(blank=True)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    stock = models.PositiveIntegerField()
    available = models.BooleanField(default=True)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('myshop:product_detail', args=[self.slug])
from django.shortcuts import render, get_object_or_404
from .models import Category, Product

# Create your views here.

def product_list(request, category_slug=None):
    category = None
    categories = Category.objects.all()
    products = Product.objects.filter(available=True)
    if category_slug:
        category = get_object_or_404(Category, slug=category_slug)
        products = products.filter(category=category)
    return render(request, 'shop/product/list.html', {'category': category, 'categories': categories, 'products': products})

def product_detail(request, product_slug):
    product = get_object_or_404(Product, slug=product_slug, available=True)
    category = product.category.filter(is_active=True)
    return render(request, 'shop/product/detail.html', {'product': product}, {'category': category})
这是views.py文件

from django.db import models
from django.urls import reverse

# Create your models here.

class Category(models.Model):
    name = models.CharField(max_length=200)
    slug = models.SlugField(max_length=200, unique=True)
    is_active = models.BooleanField(default=True)

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('myshop:product_list_by_category', args=[self.slug])

class Product(models.Model):
    category = models.ManyToManyField(Category)
    name = models.CharField(max_length=200)
    slug = models.SlugField(max_length=200)
    image = models.ImageField(upload_to='products/%Y/%m/%d', blank=True)
    description = models.TextField(blank=True)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    stock = models.PositiveIntegerField()
    available = models.BooleanField(default=True)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('myshop:product_detail', args=[self.slug])
from django.shortcuts import render, get_object_or_404
from .models import Category, Product

# Create your views here.

def product_list(request, category_slug=None):
    category = None
    categories = Category.objects.all()
    products = Product.objects.filter(available=True)
    if category_slug:
        category = get_object_or_404(Category, slug=category_slug)
        products = products.filter(category=category)
    return render(request, 'shop/product/list.html', {'category': category, 'categories': categories, 'products': products})

def product_detail(request, product_slug):
    product = get_object_or_404(Product, slug=product_slug, available=True)
    category = product.category.filter(is_active=True)
    return render(request, 'shop/product/detail.html', {'product': product}, {'category': category})
这是针对detail.html页面文件的

{% extends "shop/base.html" %}
{% load static %}

{% block title %}
    {% if category %}{{ category.title }}{% else %}Products{% endif %}
{% endblock %}

{% block content %}
    <div class="product-detail">
        <img src="{% if product.image %}{{ product.image.url }}{% else %}{% static "img/no_image.png" %}{% endif %}">
        <h1>{{ product.name }}</h1>
        {% for category in category %}<a href="{{ category.get_absolute_url }}">{{ category.name }}</a>{% if not forloop.last %}, {% endif %}
        {% endfor %}
        <p class="price">${{ product.price }}</p>
            {{ product.description|linebreaks }}
    </div>
{% endblock %}
{%extensed“shop/base.html”%}
{%load static%}
{%block title%}
{%if category%}{{category.title}{%else%}产品{%endif%}
{%endblock%}
{%block content%}
{{product.name}
{%for category%}{%if不是forloop.last%},{%endif%}
{%endfor%}

${{product.price}

{{product.description}换行符} {%endblock%}
我遵循了Django的教程中的示例书

书中包含一个代码,用于显示每个产品的一个类别,代码如下

<a href="{{ product.category.get_absolute_url }}">{{ product.
category }}</a>

我在detail.html文件中将其更改为上面的代码

谢谢你的帮助

试试看

{% for category in product.category.all %}
   <a href="{{ category.get_absolute_url }}">{{ category }}</a>
{% endfor %}
{%用于product.category.all%中的类别]
{%endfor%}