【问题标题】:Using related_name to call objects attributes in django templates使用related_name调用django模板中的对象属性
【发布时间】:2018-10-02 15:39:01
【问题描述】:

我有 3 个模型。用户、帖子和证明。帖子由用户添加到网站。当其他用户按照帖子所说的去做时。他们上传了 2 张图片来表示他们完成了任务。该模板将显示他们上传的 2 张图片。我知道我在调用图像的模板中犯了一些错误。有谁知道使用related_name 调用图像的正确方法。仅供参考,我是 python 和 Django 的新手,如果这个问题太琐碎或逻辑错误,我很抱歉

证明/models.py

User = get_user_model()

class Proof(models.Model):
    user = models.ForeignKey(User, related_name='proofmade')
    post = models.ForeignKey(Post, related_name='postproofmade')
    made_at = models.DateTimeField(auto_now=True)
    image_of_task= models.ImageField()
    proof_you_made_it = models.ImageField()
    suggestions = models.TextField(max_length=1000)

    def __str__(self):
        return self.post.title

模板

{% for user in post.made.all  %}
<div class="container">
   <img src="{{ user.proofmade.image_of_task.url }}" height="150px"/>
   <img src="{{ user.proofmade.proof_you_made_it.url }}" height="150px"/>
</div>
{% endfor %}

post/views.py

class PostDetail(SelectRelatedMixin, DetailView):
    model = Post
    select_related = ('user', 'group')

    def get_queryset(self):
        queryset = super().get_queryset()
        return queryset.filter(user__username__iexact=self.kwargs.get('username'))

【问题讨论】:

  • 这里没有足够的信息。 post 是什么? made 在哪里定义为相关名称?请至少显示视图。
  • @DanielRoseman 视图现在只有 CreateView 和 DeleteView 添加它们
  • 但是哪个视图负责呈现该模板?同样,post 是什么?
  • @DanielRoseman 很抱歉我添加了负责模板的视图
  • 那是一个重定向,根本不负责显示任何模板。

标签: python django python-3.x django-models django-templates


【解决方案1】:

ForeignKey 是一对多的关系;因此,related_name 可以访问与许多项目相对应的查询集。您需要遍历该查询集以获取各个项目,在本例中为 Proof 实例 - 就像您对每个帖子的用户所做的那样。所以,类似:

{% for user in post.made.all  %}
   {% for proof in user.proofmade.all %}
    <div class="container">
       <img src="{{ proof.image_of_task.url }}" height="150px"/>
       <img src="{{ proof.proof_you_made_it.url }}" height="150px"/>
    </div>
    {% endfor %}
{% endfor %}

【讨论】:

  • 嗨 Daniel Roseman 我知道我在将近一个月后对此提出了疑问。但我刚刚意识到这段代码可能存在一个小问题。如果用户在 2 个完全不同的帖子上有 2 个证明。 forloop 在他们两个上运行 2 次。是否可以这样修改代码。 forloop 只运行一次。也就是说:如果用户在特定帖子中有证据,它将显示该证据。如果没有,它不会显示
猜你喜欢
  • 2021-10-09
  • 1970-01-01
  • 2019-08-13
  • 1970-01-01
  • 1970-01-01
  • 2021-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多