【问题标题】:Python Django - Show all assigned objects on the web pagePython Django - 在网页上显示所有分配的对象
【发布时间】:2019-07-23 11:54:38
【问题描述】:

我正在开发用于跟踪订单的网络应用程序。我想显示用户通过 detailView 创建的所有订单。

models.py

class Order(models.Model):
    ...    
    user = models.ForeignKey(MyUser, on_delete=models.CASCADE)
    order_number = models.CharField(max_length=150)

 class MyUser(models.Model):
    eid = models.CharField(max_length=7)
    name = models.CharField(max_length=150)
    surname = models.CharField(max_length=150)

views.py

     class UserDetailView(generic.DetailView):
        model = MyUser
        template_name = "database/user_detail.html"


     def get_queryset(self):
        return Order.objects.all().order_by("-id")

user_detail.html

     {% extends "base.html" %}
     {% block content %}
     <body>
         <h1> {{ user.eid }} {{ user.name }} {{ user.surname }} 
         </h1>
         {% for order in orders %}
             order.order_number
         {% endfor %}
      {% endblock %}

使用此代码我收到错误:找不到页面:未找到与查询匹配的订单。

如果我删除views.py 中的def get_queryset(),它只显示用户的eid 和姓名。不确定如何将所有分配的订单分配给特定用户。

【问题讨论】:

  • 如果你想列出所有项(订单、用户),你应该使用generics.ListView而不是generics.DetailView

标签: python django python-3.x detailsview


【解决方案1】:

在模板中尝试:

{% for order in user.order_set.all %}
    <p>{{ order.order_number }}</p>
{% endfor %}

这使用外键关系来获取给定MyUser 实例的订单。

get_queryset() 方法用于返回一个查询集,在其中查找详细视图的对象。

【讨论】:

    【解决方案2】:

    Django 允许您“向后”跟踪关系,这意味着您可以查询与您的 modelA 具有 FK 或 OneToOne 关系的 modelB 的所有记录。

    class ModelA(models.Model):
        pass
    
    class ModelB(models.Model):
        model_a = models.ForeignKey(ModelA)
    
    ...
    modela = ModelA.objects.get(id=x)
    queryset = modela.modelb_set()
    

    也就是说,您可以在模板中执行此操作:

    {% for order in user.order_set.all %}... {% endfor %}
    

    更多信息在这里:https://docs.djangoproject.com/en/2.2/topics/db/queries/#following-relationships-backward

    【讨论】:

    • 这比generics.DetailView 更好、更低、更快还是提供更多选择? ..如果是这样或没有围绕您的答案提供上下文。由于它被机器人标记为要删除。 (来自评论)。
    • @ZF007 不是更好也不是更快,它是不同的。 DetailView 不是这里的问题,是 ORM 的使用。
    • (更新后的答案会更好;当您阅读此评论时,您可以将其标记为删除;无需在此处留下此个人反馈以供娱乐)。
    【解决方案3】:

    您的代码存在两个问题。第一个是 Higor Rossato 在 cmets 中提到的,如果你想列出多个东西,你应该使用 generics.ListView。您还应该更改视图的 modelget_queryset 属性。

    你想要model=Order

    def get_queryset(self):
        Order.objects.filter(user=self.request.user).order_by("-id")
    

    那么你应该添加一个get_context_data 方法来传递你的用户信息。

    【讨论】:

      猜你喜欢
      • 2017-04-07
      • 2011-08-08
      • 2017-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-23
      相关资源
      最近更新 更多