【问题标题】:Django Template filteringDjango 模板过滤
【发布时间】:2014-01-24 21:04:03
【问题描述】:

我正在尝试创建一个网站,您可以在其中查看不同的“等级”以及其中的人员。当我使用 Bootstrap 3 时,我已经得到它在自己的可折叠面板中创建排名,但我无法列出具有该排名的用户。请帮忙。

#team.html template
<div class="container">
 <div class="col-md-2">
  <div class="panel-group" id="accordion">
    {% for rank in Rank_list %}
    <div class="panel panel-default">
      <div class="panel-heading">
        <h4 class="panel-title">
          <a data-toggle="collapse" data-parent="#accordion" href="#collapse{{rank.rank_num}}">
            {{ rank.rank_name }}s
          </a>
        </h4>
      </div>
      <div id="collapse{{rank.rank_num}}" class="panel-collapse collapse in">
        <div class="panel-body">
          {% for name in User_list %}
            <li>
              <p>{{name}}</p>
              </li>
          {% endfor %}
        </div>
      </div>
    </div>
    {% endfor %}
  </div>
</div>

#views.py
class team(generic.ListView):
 template_name = 'main/team.html'
 context_object_name = 'Rank_list'
 context_object_name2 = 'User_list'

 def get_queryset(self):
    return Rank.objects.order_by('rank_num')
 def get_queryset2(self):
    return User.objects.order_by('name')

#models.py
class Rank(models.Model):
    rank_name = models.CharField(max_length=200)
    rank_num = models.IntegerField(default=0)
    def __str__(self):              # __unicode__ on Python 2
        return self.rank_name

class User(models.Model):
    rank = models.ForeignKey(Rank)
    name = models.CharField(max_length=200)
    def __str__(self):              # __unicode__ on Python 2
        return self.name

【问题讨论】:

    标签: python html django twitter-bootstrap


    【解决方案1】:

    您需要在外键中添加related_name。像这样:

    rank = models.ForeignKey(Rank, related_name='users')
    

    然后可以像这样循环访问用户:

    {% for user in rank.users.all %}
       {{ user }}
    {% endfor %}
    

    【讨论】:

    • 谢谢!正是我需要的帮助!
    • 无需显式添加related_name。 Django 默认设置一个,即user_set
    • 不客气!请将答案标记为已接受。另外,我建议使用 Django 的内置用户模型,如下面的 cmets 所述。请参阅 Django 文档:docs.djangoproject.com/en/dev/topics/auth/default/#user-objects
    【解决方案2】:

    对于每个Rank 对象,您可以反转关系并获取与该Rank 相关的所有Users

    # models.py
    # - Use `related_name` for making relationship that are easy to read and follow
    # - https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ForeignKey.related_name
    class User(...):
        rank = models.ForeignKey(Rank, related_name="users")  
    
    # view.py
    # - Use prefetch_related allows us to cut down our queries when iterating as we do an up-front join
    # - https://docs.djangoproject.com/en/dev/ref/models/querysets/#prefetch-related
    ...
    def get_queryset(self):
        return Rank.objects.prefetch_related('users')('rank_num')  
    
    # template.py
    {% for rank in Rank_List %} # You shouldn't capitalise your template variables
        {% for user in rank.users.all %}  
            {{ user }}
        {% endfor %}
    {% endfor %}
    

    最后,你应该使用built-in User model that django's auth module provides

    【讨论】:

    • 我正在使用内置的用户模型作为其他东西。不过谢谢!
    猜你喜欢
    • 2012-06-03
    • 1970-01-01
    • 2011-04-12
    • 2012-03-16
    • 2018-05-07
    • 2012-08-18
    • 1970-01-01
    • 2020-02-16
    • 2019-01-01
    相关资源
    最近更新 更多