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

时间:2018-09-03 22:03:48

标签: django django-templates

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

我尝试了将forloop切片在模板中的多种方式,但均失败了。我只需要从循环中得到1个结果,即可“执行A” “执行B” ,具体取决于条件。即使我有一百万个应用程序。但是一旦获得3个申请,我就有2个“做A” 或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)

4 个答案:

答案 0 :(得分:1)

您在模板中执行的逻辑过多。可以在您的视图中尝试一下(伪代码,因为我不知道您的视图结构):

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

答案 1 :(得分:0)

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

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

为便于记录,Django模板语言中没有break语句。

答案 2 :(得分:0)

我终于明白了。仍在测试此代码到目前为止,它似乎仍在工作。如果有人可以改善此代码,我将非常喜欢。即使满足条件,循环仍在运行。 <!DOCTYPE html> <html> <head> <meta name="viewport" charset="utf-8" content="width=device-width, initial-scale=1"> <link href='https://fonts.googleapis.com/css?family=Roboto:300italic,400italic,400,100,300,600,700' rel='stylesheet' type='text/css'> <link href="//maxcdn.bootstrapcdn.com/font-awesome/4.1.0/css/font-awesome.min.css" rel="stylesheet"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> <script src="https://code.jquery.com/jquery-2.2.4.min.js"></script> </head> <body> <div class="row"> <div class="column" style="background-color:#;"> <h2>STRUCTURE</h2> <br> <br> <br> <div class="box-row"> <div> <div class="box"> <div class="tooltip expand" data-title="Aiman Iskandar - Monitor all the operation in the CTS Division"> <p>Vice President</p> <p>Business Technology</p> <p>aiman iskandar</p> </div> <hr class="bar" /> </div> <div> <div class="box"> <p>Head</p> <p> Consulting & Technology Services</p> <p>aidil iman</p> </div> <hr class="bar2" /> </div> <br /> <br /> </div> </div> </div> <br> </body> </html>不起作用

|slice:":1"

答案 3 :(得分:0)

这是我在视图中获得的方式,尽管现在为时已晚,明天仍要检查

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 %}