【问题标题】:Creating pages for individual products in Django在 Django 中为单个产品创建页面
【发布时间】:2019-12-28 07:59:16
【问题描述】:

我有一个“类别”、“子类别”和“产品”模型。我不想对每个类别、子类别和产品都有一个视图,而是希望将其引用到将填充正确模型的模板。

models.py

class Category(models.Model):
    category_title = models.CharField(max_length=200)
    category_image = models.ImageField(upload_to="category")
    category_description = models.TextField()
    category_slug = models.SlugField(max_length=200, default=1)

    class Meta:
        verbose_name_plural = "Categories"

    def __str__(self):
        return self.category_title 


class Subcategory(models.Model):
    subcategory_title = models.CharField(max_length=200)
    subcategory_image = models.ImageField()
    subcategory_category = models.ForeignKey(
        Category, default=1, verbose_name="Category", on_delete=models.SET_DEFAULT)

    class Meta:
        verbose_name_plural = "Subcategories"

    def __str__(self):
        return self.subcategory_title


class Product(models.Model):
    product_title = models.CharField(max_length=200)
    product_image = models.ImageField()
    product_base_price = models.DecimalField(max_digits=12, decimal_places=2)
    product_addons = models.CharField(max_length=200, blank=True)
    product_description = models.TextField()
    product_date_added = models.DateTimeField(default=datetime.now, blank=True)
    product_slug = models.SlugField(max_length=200, default=1)
    product_subcategory = models.ForeignKey(
    Subcategory, default=1, verbose_name="Subcategories", on_delete=models.SET_DEFAULT)
    product_available = models.BooleanField(default=True)

【问题讨论】:

    标签: python django django-models django-templates


    【解决方案1】:

    列出所有带有特定产品链接的产品

    这是产品型号的示例viewurltemplate。请将myapp 替换为您的应用名称。

    定义一个视图:

    # views.py
    from django.views.generic import ListView
    from django.shortcuts import render
    from .models import Product
    
    class ProductList(ListView):
        model = Product
    
    def productdetail(request,id):
        product = Product.objects.get(id = id)
        return render(request, 'myapp/product.html', {'product': product})
    

    最后将该视图挂钩到您的网址中:

    # urls.py
    from django.urls import path
    from myapp.views import ProductList, productdetail
    
    urlpatterns = [
        path('products/', ProductList.as_view()),
        path('products/<int:pk>/', productdetail, name='productdetail'),
    ]
    

    创建一个模板以在以下位置列出产品:/path/to/project/myapp/templates/myapp/products_list.html

    {% extends "base.html" %}
    
    {% block content %}
        <h2>Products</h2>
        <ul>
            {% for product in object_list %}
                <li><a href="{% url 'productdetail' product.id %}">{{ product.product_title }} </a></li>
            {% endfor %}
        </ul>
    {% endblock %}
    

    创建一个模板来展示特定产品:/path/to/project/myapp/templates/myapp/product.html::

    {% extends "base.html" %}
    
    {% block content %}
        <h2>Product</h2>
        {{product.product_title}}
    {% endblock %}
    

    【讨论】:

    • 我认为我的问题措辞很糟糕。我不知道如何点击产品并让它加载包含特定产品属性的模板
    • @GTA.sprx 我也更新了针对特定产品的答案
    • 你从哪里得到product-detail?我得到Reverse for 'product-detail' not found. 'product-detail' is not a valid view function or pattern name.
    • 修复了答案中的一个错误。你在根urls.py 中添加了path('products/&lt;int:pk&gt;/', productdetail, name='product-detail'), 吗?
    • 我设法通过在我的根 urls.py 中执行 path('products/&lt;int:pk&gt;/', product_detail, name='product-detail'), 并在我看来将 id 更改为 pk 来使其工作。现在我只需要让我的 url 使用诸如 mysite.com/t-shirts/blue-shirt 之类的 slug 并创建包含相应外键产品的产品类别页面。
    【解决方案2】:
        product_created_on = models.DateTimeField(auto_now_add=True)
    

    我有答案,就用DateTimeField()

    【讨论】:

      猜你喜欢
      • 2020-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多