Django和模型都是新手,我正在尝试制作一个愿望列表,人们可以在其中添加到愿望列表,然后通过点击愿望列表的链接来查看他们的愿望列表中的内容。我为愿望列表创建了一个单独的模型,该模型有一个用户的foreign字段,然后是他们想添加到愿望列表中的项目的many-to-many字段。目前,我正在尝试查看我在Django中使用admin视图为用户创建的愿望列表。
我遇到的问题是,当我试图将他们的愿望列表打印到模板时,页面上会出现以下内容。
<QuerySet [<listings: item: Nimbus, description:this is the nimbus something at a price of 300 and url optional(https://www.google.com/ with a category of )>, <listings: item: broom, description:this is a broom stick at a price of 223 and url optional(www.youtube.com with a category of broom)>, <listings: item: wand, description:this is a wand at a price of 3020 and url optional(www.twitter.com with a category of sales)>]>
理想情况下,我希望查询集被拆分,这样当我基于用户迭代项目时,两个列表及其信息将在html页面上的不同行上。我知道它一定来自于我在模型本身上设置的字符串表示,但不知道如何实现这一点。我检索.all、.values、.values_list、.prefetch_related,当我转到页面或不可迭代的时,我仍然得到相同的结果
若有什么好处的话,最好是可以访问商品、描述和价格,并将其打印到愿望列表中每个商品的页面上。
这样做可能吗,或者我的方法是错误的,是否应该将愿望列表添加到其他形式中,但我认为这应该以某种方式起作用。不知道我是否已经接近,或者我的某个文件中缺少什么,或者需要创建一个新的单独视图。
以下代码:
型号.py
class User(AbstractUser):
pass
class listings(models.Model):
item = models.CharField(max_length=100)
description = models.CharField(max_length=100)
price = models.IntegerField()
url = models.CharField(max_length=100,blank=True)
category = models.CharField(max_length=100,blank=True)
def __str__(self):
return f"item: {self.item}, description:{self.description} at a price of {self.price} and url optional({self.url} with a category of {self.category})"
class bids(models.Model):
desired = models.ForeignKey(listings,on_delete=models.CASCADE,related_name="desired",null=True)
bid = models.IntegerField()
def __str__(self):
return f"{self.desired} Bid: {self.bid}"
class comments(models.Model):
information = models.ForeignKey(listings,on_delete=models.CASCADE, related_name ="Review",null=True)
title = models.CharField(max_length=100)
comment = models.CharField(max_length=100)
def __str__(self):
return f"title {self.title} Comment: {self.comment}"
class wl(models.Model):
user = models.ForeignKey(User ,on_delete=models.CASCADE, related_name="users")
product = models.ManyToManyField(listings, related_name="item_wished")
def __str__(self):
return f"{self.product.all()}"
views.py
def watch_list(request):
user = wl.objects.filter(user_id = request.user.id).prefetch_related('product')
return render(request, 'auctions/wishlist.html',{
'wishes': user
})
html模板
{% extends "auctions/layout.html" %}
{% block body %}
<h2>Active Listings</h2>
{% for i in wishes.all %}
<li> {{ i }} <li>
{% endfor %}
{% endblock %}
您的代码看起来不错。试着用结构调整一下你的模板,也许是一个HTML表:
{% extends "auctions/layout.html" %}
{% block body %}
<h2>Active Listings</h2>
<table>
{% for w in wishes %}
<tr>
<td>{{ w.pk }}</td>
<td>{{ w.product.item }}</td>
<td>{{ w.product.description }}</td>
<td>{{ w.product.price }}</td>
</tr>
{% endfor %}
</table>
{% endblock %}
查询将返回所有wl对象。带有:
{% for w in wishes %}
您对所有wl对象进行迭代。每个";w";具有";产品";字段,它是一个多对多关系-它包含多个对象,需要再次迭代:
{% for each_wl in wishes %}
{% for each_product in each_wl %}
{{ each_product.item }}
另外,将变量/类命名为更详细的名称。