Python Django - 在网页上显示所有分配的对象
Python Django - Show all assigned objects on the web page
我正在开发用于跟踪订单的网络应用程序。我想显示用户通过 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 和名称。不确定如何将所有已分配的订单分配给特定用户。
在模板中尝试:
{% for order in user.order_set.all %}
<p>{{ order.order_number }}</p>
{% endfor %}
这使用外键关系获取给定 MyUser
实例的订单。
get_queryset()
方法用于 return 查询集,在该查询集中查找详细视图的对象。
Django 允许您跟踪关系 "backwards",这意味着您可以查询与模型 A 具有 FK 或 OneToOne 关系的模型 B 的所有记录。
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
您的代码有两个问题。第一个是 Higor Rossato 在评论中提到的,如果你想列出多个东西,你应该使用 generics.ListView
。您还应该更改视图的 model
和 get_queryset
属性。
你想要model=Order
和
def get_queryset(self):
Order.objects.filter(user=self.request.user).order_by("-id")
那么您应该添加一个 get_context_data 方法来传递您的用户信息。
我正在开发用于跟踪订单的网络应用程序。我想显示用户通过 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 和名称。不确定如何将所有已分配的订单分配给特定用户。
在模板中尝试:
{% for order in user.order_set.all %}
<p>{{ order.order_number }}</p>
{% endfor %}
这使用外键关系获取给定 MyUser
实例的订单。
get_queryset()
方法用于 return 查询集,在该查询集中查找详细视图的对象。
Django 允许您跟踪关系 "backwards",这意味着您可以查询与模型 A 具有 FK 或 OneToOne 关系的模型 B 的所有记录。
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
您的代码有两个问题。第一个是 Higor Rossato 在评论中提到的,如果你想列出多个东西,你应该使用 generics.ListView
。您还应该更改视图的 model
和 get_queryset
属性。
你想要model=Order
和
def get_queryset(self):
Order.objects.filter(user=self.request.user).order_by("-id")
那么您应该添加一个 get_context_data 方法来传递您的用户信息。