【问题标题】:django filter a regroup within a forloopdjango 在 for 循环中过滤一个组
【发布时间】:2011-10-12 00:22:10
【问题描述】:

我有一个名为 Subtopic 的模型。我的一个模板在一个对象上运行一个 forloop,为表格行的每个单元格返回一个不同的字段。

两个表格单元格查找一个字段,该字段是一个多对多外键,都指向同一个外部模型资源。我希望每个都根据资源模型中布尔字段的值显示不同的结果。

您在下面看到的内容目前工作正常,但并未尝试按布尔字段进行过滤。

models.py:

class ICTResourceManager(models.Manager):
    def get_query_set(self):
        return super(ICTResourceManager, self).get_query_set().filter('is_ict': True)

class NonICTResourceManager(models.Manager):
    def get_query_set(self):
        return super(NonICTResourceManager, self).get_query_set().filter('is_ict': False)

class Resource(models.Model):
    subtopics = models.ManyToManyField(Subtopic)
    external_site = models.ForeignKey(ExternalSite)
    link_address = models.URLField(max_length=200, unique=True, verify_exists=False)
    requires_login = models.BooleanField()
    is_ict = models.BooleanField()
    flags = models.ManyToManyField(Flag, blank=True)
    comment = models.TextField()
    def __unicode__(self):
        return u'%s %s' % (self.external_site, self.link_address)
    objects = models.Manager()
    ict_objects = ICTResourceManager()
    nonict_objects = NonICTResourceManager()

    class Meta:
        ordering = ['external_site', 'link_address']

views.py:

def view_ks5topic(request, modulecode, topicshortname):
    listofsubtopics = Subtopic.objects.filter(topic__module__code__iexact = modulecode, topic__shortname__iexact = topicshortname)
    themodule = Module.objects.get(code__iexact = modulecode)
    thetopic = Topic.objects.get(module__code__iexact = modulecode, shortname__iexact = topicshortname)
    return render_to_response('topic_page.html', locals())

我的模板:

        {% for whatever in listofsubtopics %}
        <tr>
            <td>
                {{ whatever.objective_html|safe }}
                <p>
                {% if request.user.is_authenticated %}
                    {% with 'objective' as column %}
                    {% include "edit_text.html" %}
                    {% endwith %}
                {% else %}
                {% endif %}
            </td>
            <td>
                {% regroup whatever.resource_set.all by external_site.name as resource_list %}
                {% for external_site in resource_list %}
                    <h4>{{ external_site.grouper }}</h4>
                    <ul>
                        {% for item in external_site.list %}
                        <li><a href="{{ item.link_address }}">{{ item.comment }}</a></li>
                        {% endfor %}
                    </ul>
                {% endfor %}
            </td>
        </tr>        
        {% endfor %}

如您所见,我在模型中添加了额外的管理器来为我进行过滤,但是当我替换模板中的相应行时,我只会得到空白。我试过:for external_site.ict_objects in resource_listfor item.ict_objects in resource_list&lt;a href="{{ item.ict_objects.link_address }}"&gt;。如果这是在视图中,我可能只通过.filter('is_ict': True) 进行过滤,但是由于它在 forloop 中,我不知道在哪里进行过滤。

我也尝试在模板中写regroup whatever.resource_set.filter('is_ict': True),但重组的语法似乎使用resource_set.all而不是resource_set.all()(我不知道为什么)所以过滤文本在这里不起作用。

【问题讨论】:

    标签: django filter for-loop


    【解决方案1】:

    事实证明,使用自定义模板过滤器可以做到这一点。鉴于as is well documented 模板语言不是一个成熟的python 环境,最初在模板中进行过滤的努力没有奏效。我最初的问题仍然开放给任何知道更直接解决我最初提出的问题的替代方法的人,但我是这样做的:

    myapp_extras.py:

    from django import template
    
    register = template.Library()
    
    def ict(value, arg):
        "filters on whether the is_ict Boolean is true"
        return value.filter(is_ict=arg)
    
    register.filter('ict', ict)
    

    我的模板,注意第2行自定义过滤器的使用:

    <td>
        {% regroup whatever.resource_set.all|ict:1 by external_site.name as resource_list %}
        {% for external_site in resource_list %}
            <h4>{{ external_site.grouper }}</h4>
            <ul>
            {% for item in external_site.list %}
                <li><a href="{{ item.link_address }}">{{ item.comment }}</a></li>
            {% endfor %}
            </ul>
        {% endfor %}
    </td>
    

    在此之后,我能够从模型中删除额外的自定义管理器。

    还有一个问题,在过滤布尔 is_ict 字段时,我发现我必须使用filter(is_ict=1)filter(is_ict=0)。这是引用TrueFalse 值的唯一方法吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-11
      • 1970-01-01
      • 1970-01-01
      • 2017-12-24
      • 1970-01-01
      • 1970-01-01
      • 2021-10-16
      • 1970-01-01
      相关资源
      最近更新 更多