django如何显示新添加产品的详细信息页面

时间:2018-08-01 17:53:48

标签: python django

我仍然是python django的学习者。我正在尝试创建一个站点,用户可以在其中添加新产品,并且应该能够在另一页中看到最新添加的产品的详细信息。我能够实现第一部分,即“添加产品”页面。但是我需要有关如何正确获取详细信息页面的帮助。请求指导。

我的model.py如下:

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

from category.models import Subcategory, Category
from category.utils import unique_slugify

class Product(models.Model):
    category = models.ForeignKey(Category, related_name='products', on_delete=CASCADE)
    subcategory = models.ForeignKey(Subcategory, related_name='products', on_delete=CASCADE)
    name = models.CharField(max_length=200, db_index=True)
    slug = models.SlugField(max_length=200, db_index=True, blank=True)
    image = models.ImageField(upload_to='images/', blank=True)
    description = models.TextField(blank=True)
    price = models.IntegerField(default=0)
    stock = models.PositiveIntegerField()
    available = models.BooleanField(default=True)
    created = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ('-created',)
        index_together = (('id', 'slug'),)

    def __str__(self):
        return self.name

    def save(self, **kwargs):
        slug_str = "%s %s %s" % (self.name, self.category, self.subcategory)
        unique_slugify(self, slug_str)
        super(Product, self).save(**kwargs)

我的views.py如下所示:

from django.shortcuts import render, get_list_or_404
from django.urls import reverse_lazy
from django.views.generic import CreateView, UpdateView, ListView

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



class ProductListView(ListView):
    model = Product
    context_object_name = 'product'

class ProductCreateView(CreateView):
    model = Product
    form_class = ProductForm
    success_url = reverse_lazy('product_changelist')

def productlist(request):
    prodlist = Product.objects.order_by('-pk')[0]
    return render(request, 'product/product_list.html', {'prodlist': prodlist})

class ProductUpdateView(UpdateView):
    model = Product
    form_class = ProductForm
    success_url = reverse_lazy('product_changelist')

def load_subcategory(request):
    category_id = request.GET.get('category')
    subcategory = Subcategory.objects.filter(category_id=category_id).order_by('name')
return render(request, 'product/subcategory_dropdown_list_options.html', {'subcategory': subcategory})

我的产品应用程序urls.py如下:

from django.urls import include, path
from . import views


urlpatterns = [
    path('', views.ProductListView.as_view(), name='product_changelist'),
    path('add/', views.ProductCreateView.as_view(), name='product_add'),
    path('<int:pk>/', views.ProductUpdateView.as_view(), name='product_change'),
    path('ajax/load-subcategory/', views.load_subcategory, name='ajax_load_subcategory'),

]

主要urls.py如下:

from django.contrib import admin
from django.urls import path, include
from category.views import CategoryListView

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', CategoryListView.as_view(), name='home'),
    path('category/', CategoryListView.as_view()),
    path('category/', include('category.urls')),
    path('product/', include('product.urls'), name='product'),
]

我创建了一个product_list.html,其中要显示最新添加的产品详细信息。

它只有以下代码:

{{ prodlist }}

当前添加新产品时,我可以在localhost:8000 / admin页面上看到该产品。 但是在单击添加按钮后,我看到一个空白页localhost:8000 / product

提前感谢所有帮助和指导

1 个答案:

答案 0 :(得分:0)

如果页面完全空白,则可能意味着您的查询实际上未在视图中返回任何内容。您可以尝试从视图中打印产品清单,然后检查控制台以查看是否返回了任何内容。

更好的策略可能是为每个产品都有一个唯一的显示页面。

为所有产品提供一个页面,而不是获取所有产品并获取最新的产品。这样可以提供更大的灵活性,并让您轻松查看任何产品。

您为您的应用创建的新urls.py可能类似于

 urlpatterns = [
  path('<product_id>', views.ProductListView.as_view(), name='product_changelist'),
  path('add/', views.ProductCreateView.as_view(), name='product_add'),
  path('<int:pk>/', views.ProductUpdateView.as_view(), name='product_change'),
  path('ajax/load-subcategory/', views.load_subcategory, name='ajax_load_subcategory'),
]

然后在您的views.py

def productlist(request, product_id):
  product = Product.objects.get(productid=product_id)
  return render(request, 'product/product_list.html', {'product': product})

然后终于在您的商店列表中:

{{product.name}}

很遗憾,如果没有更多信息,很难确定您的错误,希望对您有所帮助。