django python:如何根据一个应用的pk的特性(作为另一个应用中的外键)进行过滤

时间:2018-08-22 11:57:48

标签: python django

我正在尝试创建一个电子商务站点来学习python和django。我创建了一个名为category的应用程序。这有2个表,分别称为Category和Subcategory。类别表的pk是子类别表中的外键。在类别应用程序的views.py中,我已覆盖SubcategoryListView中的get_queryset,以显示特定于用户单击的类别的子类别项。到目前为止,一切正常。 如果从主页上单击“孩子”链接,则我的网址显示为http://localhost:8000/category/kids/

我创建了另一个名为product的应用程序(我不确定这是否是正确的方法,还是我也应该对产品使用类别应用程序)。这有一个称为产品的表。类别表的pk和子类别表的pk都是产品表中的外键。当我单击子类别链接时,我希望显示属于该子类别的所有产品。我无法实现这一目标。 就像在孩子页面中,如果我单击链接“连衣裙”,我希望网址为 http://localhost:8000/category/kids/dresses-kids (dresses-kids是孩子子类别中“连衣裙”的子弹)

我的产品/views.py如下:

class ProductListView(ListView):
    queryset = Product.objects.all()
    template_name = "product_list.html"

    def get_queryset(self):
        return Product.objects.filter(subcategory__slug__contains=self.kwargs['slug'])

以上代码正确吗?类似的东西已经为子类别中的类别过滤器起作用

我不确定urls.py中应该包含什么。还要使用哪个urls.py,对应用程序urls.py或产品应用程序urls.py进行分类。

在这方面的任何帮助都将不胜感激。

Edit1:

我在category / urls.py

中尝试了类似的方法
path('kids/<slug:slug>/', ProductListView.as_view()),

当我手动输入网址为     http://localhost:8000/category/kids/dresses-kids/ 我转到下一页,在该页面上我可以看到洋装下面的产品列表,但是从子类别页面(http://localhost:8000/category/kids/),当我单击洋装时,URL不会更改,并且我仍然会在子类别页面中。

您可能还会注意到,我在urls.py中对孩子进行了硬编码。我不知道该如何动态获取。在这方面也需要帮助。

谢谢。

Edit2:

@ User42感谢您的回复。 category / urls.py如下:

from django.conf import settings
from django.conf.urls.static import static
from django.conf.urls import url
from django.urls import path

from product.views import ProductListView
from .views import SubcategoryListView

urlpatterns = [
    url(r'^(?P<slug>[\w-]+)/$', SubcategoryListView.as_view()),
    path('kids/<slug:slug>/', ProductListView.as_view()),
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

ProductListView的模板文件如下:

{% extends 'base.html' %}

{% block content %}
<div class="album py-5 bg-light">
          <div class="container">
              <div class="row">

                  {% for object in object_list %}

                  <div class="col-md-4">
                <div class="card mb-4 box-shadow">
                  <a class="nav-link" href="{{ object.get_absolute_url }}">
                  <img class="card-img-top" src="{{ object.image }}" height="400" width="100"/>
                  </a>
                    <a class="card-body"></a>
                    <a href="{{ object.get_absolute_url }}"><p class="card-text text-center">{{ object.name }}</p></a>
                </div>
                    </div>
                    {% endfor %}
              </div>
          </div>
      </div>

{% endblock %}

product / views.py如下:

from django.http import Http404
from django.shortcuts import render, get_object_or_404
from django.urls import reverse_lazy
from django.views.generic import CreateView, UpdateView, ListView, DetailView

from category.models import Subcategory
from product.forms import ProductForm
from product.models import Product

class ProductListView(ListView):
    queryset = Product.objects.all()
    template_name = "product/product_list.html"

    def get_queryset(self):
        return Product.objects.filter(subcategory__slug__contains=self.kwargs['slug'])

class ProductDetailView(DetailView):
    queryset = Product.objects.all()
    template_name = "product/product_detail.html"

    def get_context_data(self, *args, **kwargs):
        context = super(ProductDetailView, self).get_context_data(*args, **kwargs)
        print(context)
        return context

如果您需要其他详细信息,请告诉我。

谢谢。

Edit3:

@SachinKukreja感谢您的答复。

子类别的模板如下:

{% extends 'base.html' %}

{% block content %}
    <br />
    <br />
     <div class="album py-5 bg-light">
          <div class="container">
              <div class="row">

                  {% for object in object_list %}

                  <div class="col-md-4">
                <div class="card mb-4 box-shadow">
                  <a class="nav-link" href="{{ object.get_absolute_url }}">
                  <img class="card-img-top" src="{{ object.image.url }}" height="400" width="100"/>
                  </a>
                    <a class="card-body"></a>
                    <a href="{{ object.get_absolute_url }}"><p class="card-text text-center">{{ object.name }}</p></a>
                </div>
                    </div>
                    {% endfor %}
              </div>
          </div>
      </div>

{% endblock %}

预先感谢所有帮助。

0 个答案:

没有答案
相关问题