【问题标题】:Generic detail view must be called with either an object pk or a slug必须使用对象 pk 或 slug 调用通用详细视图
【发布时间】:2013-10-16 15:16:36
【问题描述】:

当我尝试访问我的产品型号的详细信息页面时收到该错误消息。我在 url 文件中有 slug 字段,但这似乎并不重要。

型号

class Product(models.Model):
    product_name= models.CharField(max_length=30, blank=False, null=False, verbose_name="the product name")
    product_slug= models.SlugField(max_length=30, blank=False, null=False, verbose_name="the product slug")
    product_excerpt= models.CharField(max_length=100, blank=False, null=False, verbose_name="product excerpt")
    def _set_product_code(self):
        product_code_temp = hashlib.sha224()
        product_hash = self.product_name
        product_hash = product_hash.encode('utf-8')
        product_code_temp.update(product_hash)
        return product_code_temp.hexdigest()[0:5]
product_code = property(_set_product_code)

查看

class ProductPage(DetailView):
    model = Product
    context_object_name = 'product'
    template_name="product.html"

网址

url(r'^product/(?P<product_slug>\w+)/(?P<product_code>\w+)/$', ProductPage.as_view(), name="product"),

谁能指出我做错了什么?

【问题讨论】:

    标签: django


    【解决方案1】:

    我想补充一点,get_object 也可以用于我们有不同的主键查找参数的情况

    例如,如果我想通过 guid 获取我的对象,我将在我的 URLConf 中传递它

    def get_object(self):
        return Product.objects.get(guid=self.kwargs.get("guid"))
    

    【讨论】:

    • 这行得通。 get_object 应该添加到详细视图中。还有一个小错误,它是 uuid 而不是 guid
    【解决方案2】:

    在视图类上设置slug_field属性:

    class ProductPage(DetailView):
        model = Product
        slug_field = 'product_slug'
    

    根据您的 URLConf,您可能还需要指定与 slug 对应的 kwarg 的名称。它默认为“蛞蝓”。如果您在 URL 规范中使用了不同的内容,例如本示例中的“product_slug”,请同时在视图上指定 slug_url_kwarg 属性:

        slug_url_kwarg = 'product_slug'
        # etc
    

    【讨论】:

      【解决方案3】:

      models.py

      product_slug = models.SlugField(null=True, blank=True, help_text="Product slug field", db_column="product_slug",
                                      verbose_name="slug product", error_messages={"required": "Enter the slug field"},
                                      unique=True, )
      

      使用下面的正则表达式为 pk 和 slug 写一行:

      urls.py

      url(r'(^products/(?P<pk>\d+)/$)|(^products/(?P<product_slug>\w+)/$)',ProductDetailView.as_view(), name='product-detail-view')
      

      views.py

      class ProductDetailView(DetailView):
           model = Products
           extra_context = {'title': 'products-detail-view'}
           pk_url_kwarg = 'pk'
           query_pk_and_slug = True
           slug_field = 'product_slug'
           slug_url_kwarg = 'product_slug'
      

      【讨论】:

        猜你喜欢
        • 2018-07-07
        • 2014-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-25
        相关资源
        最近更新 更多