Py学习  »  Django

如何在Django模板中嵌套的if语句为true时立即结束forloop

MarcoBianchi • 5 年前 • 1471 次点击  

介绍- 一个名为application的对象,它有许多属性,下面是模型。其中一个属性是用户。我想看看request.user是否在对象用户列表中

我试过切 forloop 模板中有很多方法,但都失败了。我也只需要一个循环结果 “做” “做B” 视情况而定。即使我有一百万个应用程序。但一旦我收到3份申请,我就有2份 “做” 或2 “B” . |slice:":1" 除非我用错了,否则不起作用。下面是我的代码

{% for app in applications %} #applications is a Application.objects.all()
    {% if applicant.username in app.user.username %} #applicant is request.user The code checks if request.user is a part of objects.users list
        <p> Do A </p>
    {% else %}  
        <p> Do B </p>
    {% endif %}
{% endfor %}

下面是我的模型

class Application(models.Model):
    user = models.ForeignKey(User, related_name='verified')
    applied_on = models.DateTimeField(auto_now_add=True)
    ... # Alot more fields
    token = models.CharField(max_length=350)
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/38720
 
1471 次点击  
文章 [ 4 ]  |  最新文章 5 年前
MarcoBianchi
Reply   •   1 楼
MarcoBianchi    6 年前

我终于明白了。仍然在测试这段代码,它看起来到目前为止工作正常。如果有人能改进这段代码,我会很高兴的。因为循环在满足条件后仍在运行。这个 |slice:":1" 不起作用

{% for app in applications %}  
    {% if applicant.username in app.user.username %} #drawback of this code the loop runs even after the condition is met. No way in Django template to stop that. See my 2nd answer the code is better but logic run in views
    <p> Do A </p>
    {% endif %}
{% empty %}
     <p> Do B <p>
{% endfor %}
MarcoBianchi
Reply   •   2 楼
MarcoBianchi    6 年前

这就是我在视图中得到它的方式,尽管现在太迟了明天会检查

def get_context_data(self, **kwargs):
    context = super(CreateApplication, self).get_context_data()
    context['applicant'] = self.request.user
    context['applications'] = Application.objects.all() #Application.objects.filter(is what I have used though)
    already_applied = None
    for app in Application.objects.all(): #Application.objects.filter(is what I have used though)
        if self.request.user.username in app.user.username:
            already_applied = self.request.user
            already_applied.save()
            print(already_applied)
            break
    context['already_applied'] = already_applied
    return context

下面是模板

{% if applicant == already_applied %}
    <p> Do A </p>
{% else %}
    <p> Do B </p> 
{% endif %}
Selcuk
Reply   •   3 楼
Selcuk    6 年前

如果只需要第一个元素,就不需要 for 循环。只需使用索引处的值 0 (即第一个值):

{% if applicant.username in applications.0.user.username %}
    <p> Do A </p>
{% else %}  
    <p> Do B </p>
{% endif %}

据记录,没有 break Django模板语言中的语句。

shacker
Reply   •   4 楼
shacker    6 年前

你在模板中做了太多的逻辑。改为在视图中尝试此操作(伪代码,因为我不知道视图的结构):

applicants = Application.objects.all().values_list('user__username', flat=True) context = {'is_applicant': request.user.username in applicants}

在模板中:

if is_applicant:
    something
else:
    something else