社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Django

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

MarcoBianchi • 5 年前 • 1473 次点击  

介绍- 一个名为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
 
1473 次点击  
文章 [ 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