“函数”对象在DetailView上没有属性“全部”

2024-09-28 05:21:37 发布

您现在位置:Python中文网/ 问答频道 /正文

有人能给我一个快速的解释,关于我做错了什么,我得到了这个错误。我使用了DetailView

Views.py

from django.views.generic import ListView, DetailView
from main import models

class BlogDetail(DetailView):
    model_name = models.BlogTitle
    template_name = 'main/blog.html'
    context_object_name = 'object'

    def queryset(self):
        return models.BlogTitle.objects.order_by('title')

models.py

from django.db import models
from django.contrib.auth.models import User



class BlogTitle(models.Model):
    title = models.CharField(max_length = 64)

    def __str__(self):
        return self.title

class Blog(models.Model):
    author = models.CharField(max_length = 64, default = False)        
    title = models.OneToOneField(BlogTitle, on_delete=models.CASCADE)
    category = models.CharField(max_length = 64)
    content = models.TextField()

    def __str__(self):
        return self.author

url.py

path('blogs/<int:pk>', auth(views.BlogDetail.as_view()), name = 'blog'),

blog.html

{% extends 'base.html' %}
{% block content %}

    

    {{ object.title }}
    {{ object.category }}
    {{ object.content }}

{% endblock %}

我也试过这个,但没有成功


Tags: djangonamefrompyimportselfobjecttitle
1条回答
网友
1楼 · 发布于 2024-09-28 05:21:37

django附带的大多数通用视图混合提供了可重写的类属性^{}和可重写的方法^{}。因此,你可以:

class BlogDetail(DetailView):
    # ...
    queryset = models.BlogTitle.objects.order_by('title')

class BlogDetail(DetailView):
    model = models.BlogTitle   # not "model_name"
    # ...
    def get_queryset(self):
        qs = super().get_queryset()
        return qs.order_by('title')

通过混合命名,您的视图现在可以访问self.queryset.all(),但是由于self.queryset现在是一个函数,您看到了错误。通常,在查询集不依赖于特定请求的情况下使用queryset,在依赖于特定请求的情况下使用get_queryset(正如您有权访问self.request),或者如果出于某种原因,定义查询集已经需要执行数据库查询,则使用get_queryset,或者使用的程度较低,但不应该在模块级别执行。对我来说,令人费解的是,您覆盖它只是为了更改顺序,这对于仅使用queryset提取单个实例的详细视图来说没有什么意义

相关问题 更多 >

    热门问题