我正在尝试显示用户可以“心脏”的树木列表。在Django,我没有运气。
models.py
from django.db import models
from django.contrib.auth.models import User
class Tree(models.Model):
treeId = models.IntegerField(primary_key=True)
neighbourhood = models.CharField(max_length=128,blank=True)
commonName = models.CharField(max_length=128, blank=True)
diameter = models.FloatField(blank=True)
streetNumber = models.PositiveSmallIntegerField(blank=True)
street = models.CharField(max_length=128, blank=True)
class UserProfile(models.Model):
# This line is required. Links UserProfile to a User model instance.
user = models.OneToOneField(User)
# Tree field is used to store user's favourite trees
tree = models.ManyToManyField(Tree, blank=True)
views.py
@login_required
def favourites(request):
current_user = UserProfile.objects.get(id=request.user.id)
tree_list = current_user.tree.all()
context_dict = {'trees' : tree_list}
return render(request, 'hug/favourites.html', context_dict)
favourites.html
{% for tree in trees %}
<p>tree id - {{ tree.treeId }}</p>
<p> {{ tree.commonName|title }}</p>
{% endfor %}
我尝试过打印语句,似乎不喜欢这行代码:tree_list = current_user.tree.all()
(因为它不打印任何内容),当我在服务器上运行代码时,我得到:
UserProfile matching query does not exist.
非常感谢任何建议。
谢谢,
A
答案 0 :(得分:0)
您的代码存在一些问题。
首先,Tree模型将主键定义为IntegerField,而不是AutoField。这意味着它不会自动分配ID;所以当你尝试添加新树时,你可能会得到一个IntegrityError。除非有充分的理由,否则你应该省略这个字段,让Django定义自己的自动id。
其次,获取UserProfile的代码是错误的。您正在尝试获取其ID与当前用户的ID相同的UserProfile。假设User和UserProfile中的ID相同;并且没有理由认为这一点。这几乎可以肯定你得到“不存在”的错误:你正在查找错误的ID。
从用户获取UserProfile的正确方法是:
user_profile = request.user.userprofile
但是,我会问你为什么需要UserProfile模型。它包含的唯一内容是ManyToManyField;并且因为你定义那些关系的哪一方没有区别,为什么不将它放入Tree并直接与User建立关系?这避免了整个查找并极大地简化了问题。然后你就可以做到:
tree_list = request.user.tree.all()