从 OnetoOne 在 Django 中检索和显示 ManyToMany 字段 Class
Retrieving and Displaying a ManyToMany field in Django from a OnetoOne Class
我试图在 Django 中显示用户可以 'heart' 的树列表,但我没有运气。
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.
如有任何建议,我们将不胜感激。
谢谢,
一个
您的代码存在一些问题。
首先,Tree 模型将主键定义为 IntegerField,而不是 AutoField。这意味着它不会自动分配 id;因此,当您尝试添加新树时,您可能会遇到 IntegrityError。除非有充分的理由,否则你应该省略这个字段并让 Django 定义它自己的自动 id。
其次,您获取 UserProfile 的代码是错误的。您正在尝试获取 ID 与当前用户 ID 相同的 UserProfile。假设 User 和 UserProfile 中的 ID 相同;没有理由这样假设。这几乎可以肯定是您收到 "does not exist" 错误的原因:您正在查找错误的 ID。
从用户获取 UserProfile 的正确方法是:
user_profile = request.user.userprofile
但是,我会质疑您为什么需要 UserProfile 模型。它唯一包含的是 ManyToManyField;既然在关系的哪一边定义这些关系没有区别,为什么不把它放到 Tree 中并直接与 User 建立关系呢?这避免了整个查找并极大地简化了问题。那么你可以这样做:
tree_list = request.user.tree.all()
我试图在 Django 中显示用户可以 'heart' 的树列表,但我没有运气。
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.
如有任何建议,我们将不胜感激。
谢谢,
一个
您的代码存在一些问题。
首先,Tree 模型将主键定义为 IntegerField,而不是 AutoField。这意味着它不会自动分配 id;因此,当您尝试添加新树时,您可能会遇到 IntegrityError。除非有充分的理由,否则你应该省略这个字段并让 Django 定义它自己的自动 id。
其次,您获取 UserProfile 的代码是错误的。您正在尝试获取 ID 与当前用户 ID 相同的 UserProfile。假设 User 和 UserProfile 中的 ID 相同;没有理由这样假设。这几乎可以肯定是您收到 "does not exist" 错误的原因:您正在查找错误的 ID。
从用户获取 UserProfile 的正确方法是:
user_profile = request.user.userprofile
但是,我会质疑您为什么需要 UserProfile 模型。它唯一包含的是 ManyToManyField;既然在关系的哪一边定义这些关系没有区别,为什么不把它放到 Tree 中并直接与 User 建立关系呢?这避免了整个查找并极大地简化了问题。那么你可以这样做:
tree_list = request.user.tree.all()