【问题标题】:Django DetailView but get_object_or_404() instead of get_object()Django DetailView 但 get_object_or_404() 而不是 get_object()
【发布时间】:2021-03-30 19:18:48
【问题描述】:

我有一个具有live 布尔属性的 Django 模型。

我希望视图通过 slug 获取模型,并且只有在它处于活动状态时才使用 DetailView(不是基于函数的视图,因为我想看看如何去做。

模型定义

# myapp/models.py

class MyModel(models.Model):
    name = models.CharField(max_length=255)
    live = models.BooleanField(default=True)
    slug = models.SlugField()

    def save(self, *args, **kwargs):
        self.slug = slugify(self.name)

我希望它会是这样的:

class ModelDetailView(DetailView):
    model = MyModel
    
    def get(self, request, *args, **kwargs):
        service = self.get_object_or_404(Service, live=True)  # <- Main point of what I'm looking for help with
        return super().get(request, *args, *kwargs)

有没有办法过滤这种方式?

【问题讨论】:

  • 基于类的视图有 no get_object_or_404,但 get_object 会引发 Http404 异常。
  • @WillemVanOnsem 有没有办法在 get_object() 中进行过滤?比如“get_object(live=True)”之类的?

标签: django


【解决方案1】:

你可以指定queryset来过滤,所以:

class ModelDetailView(DetailView):
    model = MyModel
    queryset = MyModel.objects.filter(live=True)

因此您根本不需要实现.get(…) 方法。

【讨论】:

  • 这太完美了!谢谢你:)
  • 在官方文档中哪里可以找到这个?我当然在QuerySet API page 上找不到它!
  • 过滤本身在QuerySet API中,关于视图的详细信息在docs.djangoproject.com/en/3.2/ref/class-based-views/…中
  • 谢谢。我的错 - 我没有意识到 live=True 是自定义检查。只需仔细阅读整个问题。我在另一个教程的其他地方看到过,并假设它是框架的一部分,它只是一个约定。无论如何,谢谢,抱歉打扰! :)
猜你喜欢
  • 2019-03-04
  • 2020-05-23
  • 2017-07-27
  • 2017-05-12
  • 1970-01-01
  • 1970-01-01
  • 2017-01-08
  • 2020-04-30
相关资源
最近更新 更多