For循环中的For循环Django模板



我想在模板中设置"发送请求/取消请求"功能
如果请求存在"取消",如果不存在"发送",则显示问题。我不知道如何正确地获取请求并将"profile"与"to_profile"进行比较
现在我被"for"循环中的"for"环路卡住了…\

在模板中,它显示了一个配置文件的3个按钮(该事件请求的数量相同(在此处输入图像描述

你能给我一些如何修复、避免或用另一种方式做的提示吗
谢谢!

请求模型

class EventInviteRequest(models.Model):
from_event = models.ForeignKey(Event, on_delete=models.CASCADE,
related_name='from_event', null=True)
to_profile = models.ForeignKey(Profile, on_delete=models.CASCADE,
related_name='to_profile', null=True)
timestamp = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f"From {self.from_event} to {self.to_profile}"

查看我尝试使用

def get_list_of_all_users(request, event_id):
"""Get list of all users"""
event = Event.objects.get(id=event_id)
profiles = Profile.objects.all()
requests = EventInviteRequest.objects.filter(from_event=event)
context = {'profiles': profiles, 'event': event, 'requests': requests}
return render(request, 'events/invite_all_profiles_to_event.html', context)

模板

{% extends 'base.html' %}
{% load static %}
{% block title %}All profiles{% endblock %}
{% block content %}

<h3>All profiles:</h3>
{% for profile in profiles %}
<div style="display: inline-block; margin-right: 10px; text-align: center;">
<a href="{% url 'account:profile' profile.id %}">
{% if profile.photo %}
<img src="{{ profile.photo.url }}" width="70" height="100">
{% else %}
<img src="{% static 'images/no_img/no_img.png' %}" width="70" height="100">
{% endif %} 
<h4>{{ profile.user }}</h4>
</a>
{% if request.user == profile.user %}
<p>You</p>
{% else %}
{% if profile in request.user.profile.friends.all %}
<p>Friends</p>
{% else %}
{% if profile == request.user.profile %}
{% else %}
<a href="{% url 'account:send' profile.id %}">Add to friends</a>
{% endif %}
{% endif %}
<br>
{% endif %}
{% if request.user.profile == profile %}
{% else %}
<br>
The problem here
{% for req in requests %}
{% if req.to_profile == profile %}
<a href="{% url 'events:cancel_event_invite' event.id profile.id %}">Cancel</a>
<br>
{% else %}
<a href="{% url 'events:invite_user_to_event' event.id profile.id %}">Invite to event</a>
<br>
{% endif %}
{% endfor %}
{% endif %}
</div>
{% empty %}
<p>No profiles yet</p>
{% endfor %}

{% endblock %}

更新
我找到了解决方案,我不确定它有多好,但它对我来说是有效的。

{% for req in profile.to_profile.all %}
{% if profile == req.to_profile %}
<a href="{% url 'events:cancel_event_invite' event.id profile.id %}">Cancel</a>
{% else %}
<a href="{% url 'events:invite_profile_redirect' event.id profile.id %}">Invite to event</a>
{% endif %}
{% empty %}
<a href="{% url 'events:invite_profile_redirect' event.id profile.id %}">Invite to event</a>
{% endfor %}

尝试这样做。型号.py

class EventInviteRequest(models.Model):
from_event = models.ForeignKey(Event, on_delete=models.CASCADE,
related_name='from_event', blank=True,null=True)
to_profile = models.ManyToManyField(Profile, on_delete=models.CASCADE,
related_name='to_profile', blank=True,null=True)
timestamp = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f"From {self.from_event}"
  1. 运行python manage.py makemigrations
  2. 运行python manage.py migrate

views.py

def get_list_of_all_users(request, event_id):
"""Get list of all users"""
event = Event.objects.get(id=event_id)
profiles = Profile.objects.all()
requests = EventInviteRequest.objects.filter(from_event=event)
context = {'profiles': profiles, 'event': event, 'requests': requests}
return render(request, 'events/invite_all_profiles_to_event.html', context)

在你的模板中,你有问题

{% for req in requests %}
{% if profile in req.to_profile.all %}
<a href="{% url 'events:cancel_event_invite' event.id profile.id %}">Cancel</a>
<br>
{% else %}
<a href="{% url 'events:invite_user_to_event' event.id profile.id %}">Invite to event</a>
<br>
{% endif %}
{% endfor %}

最新更新