Как завершить цикл, как только вложенный оператор if в Django Template верен - PullRequest
0 голосов
/ 04 сентября 2018

Intro- I объект, называемый приложением. У него много атрибутов. Ниже приведена модель. Одним из атрибутов является пользователь. Я хочу посмотреть, есть ли request.user в списке пользователей объектов

Я пробовал нарезать forloop много способов в шаблоне, но не смог. Мне нужен только 1 результат из цикла. Либо "Do A" или "Do B" В зависимости от условий. Даже если у меня есть миллион заявок. но как только я получу 3 приложения, у меня будет 2 "Do A" или 2 "Do 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 голосов
/ 04 сентября 2018

В ваших шаблонах слишком много логики. Вместо этого попробуйте это в своем представлении (псевдокод, поскольку я не знаю структуру вашего представления):

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
0 голосов
/ 04 сентября 2018

Я наконец понял это. Все еще тестирую этот код. Похоже, он работает до сих пор. Я был бы рад, если бы кто-то смог улучшить этот код. Поскольку цикл работает даже после того, как условие выполнено. |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 %}
0 голосов
/ 04 сентября 2018

Это то, как я получил это в представлениях, все еще должен проверить это для ошибок, хотя слишком поздно теперь проверю завтра

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 %}
0 голосов
/ 04 сентября 2018

Если вам нужен только первый элемент, вам не нужен цикл for. Просто используйте значение по индексу 0 (т.е. первое значение):

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

Для записи в шаблоне языка Django нет оператора break.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...