django - 如何存储数据并在另一个视图中显示它们?姜戈
问题描述
我有一个简单的体育赛事应用程序。我以用户身份登录,我有一个可以加入的活动列表。当我加入事件时,成员值 current_member 会增加。我有另一个视图,其中包含当前登录用户创建的事件列表。我想在这个视图中做更多的是显示也加入的事件。在 my_events.hmtl(下面的代码)中,我想循环显示这些事件。我该怎么做?
模型.py
class Event(models.Model):
SPORT = (
('Football', 'Football'),
('Volleyball', 'Volleyball'),
('Basketball', 'Basketball'),
('Futsal', 'Futsal'),
('Tennis', 'Tennis'),
('Handball', 'Handball'),
('Ice Hockey', 'Ice Hockey'),
('Paintball', 'Paintball')
)
creator = models.ForeignKey(User, null=True, on_delete=models.SET_NULL)
sport = models.CharField(max_length=20, null=True, choices=SPORT)
event_name = models.CharField(max_length=30)
event_date = models.DateTimeField(default=date.today())
end_event_date = models.DateTimeField(default=date.today())
current_members = models.IntegerField(default=1)
total_members = models.IntegerField(default=0)
event_location = models.CharField(max_length=50)
cost = models.FloatField(default=0, max_length=5)
description = models.CharField(max_length=300, blank=True)
视图.py
@login_required(login_url='login')
def join_event(request, pk):
event = Event.objects.get(id=pk)
if request.method == "POST":
event.current_members += 1
if event.current_members <= event.total_members:
event.save()
return redirect('/')
else:
messages.error(request, 'Event is full!')
context = {'event': event}
return render(request, 'events/join_event.html', context)
@login_required(login_url='login')
def my_events(request):
events = request.user.event_set.all()
print('EVENTS', events)
context = {'events': events}
return render(request, 'events/my_events.html', context)
my_events.html
{% extends 'events/main.html' %}
{% block content %}
<div class="row">
<div class="card card-body">
<h5>My own events</h5>
<hr>
<div class="card card-body">
<table class="table table-sm">
<tr>
<th>Name</th>
<th>Date</th>
<th>End Date</th>
<th>Location</th>
<th>Cost</th>
<th>Members</th>
<th>Update</th>
<th>Remove</th>
</tr>
{% for event in events %}
<tr>
<th>{{event.event_name}}</th>
<th>{{event.event_date}}</th>
<th>{{event.end_event_date}}</th>
<th>{{event.event_location}}</th>
<th>{{event.cost}}</th>
<th>{{event.current_members}}/{{event.total_members}}</th>
<th>
<a class="btn btn-sm btn-info" href="{% url 'update_event' event.id %}">
Update
</a>
</th>
<th>
<a class="btn btn-sm btn-danger" href="{% url 'delete_event' event.id %}">
Delete
</a>
</th>
</tr>
{% endfor %}
</table>
</div>
</div>
</div>
<div class="row">
<div class="card card-body">
<h5>Joined events</h5>
<hr>
<div class="card card-body">
<table class="table table-sm">
<tr>
<th>Name</th>
<th>Date</th>
<th>End Date</th>
<th>Location</th>
<th>Cost</th>
<th>Members</th>
<th>Update</th>
<th>Remove</th>
</tr>
<!-- HERE I WANT TO DISPLAY IN FOR LOOP THOSE EVENTS LIKE ABOVE -->
</table>
</div>
</div>
</div>
{%endblock content%}
解决方案
您可以使用会话
要保存您的数据,请使用:request.session["joined_event"] = pk
在另一个视图中获取您的数据:request.session.get("joined_event")
您还可以将 id 列表保存在request.session
您可以尝试以下示例:
@login_required(login_url='login')
def join_event(request, pk):
event = Event.objects.get(id=pk)
if request.method == "POST":
event.current_members += 1
if request.session.get("joined_event"):
request.session["joined_event"].append(pk)
else:
request.session["joined_event"] = [pk]
if event.current_members <= event.total_members:
event.save()
return redirect('/')
else:
messages.error(request, 'Event is full!')
context = {'event': event}
return render(request, 'events/join_event.html', context)
@login_required(login_url='login')
def my_events(request):
joined_event = request.user.event_set.filter(id__in=request.session.get("joined_event", []))
events = request.user.event_set.all()
print('EVENTS', events)
context = {'events': events, 'joined_event': joined_event}
return render(request, 'events/my_events.html', context)
编辑 MIDDLEWARE 设置并确保它包含
'django.contrib.sessions.middleware.SessionMiddleware'
SESSION_SAVE_EVERY_REQUEST=True
在你的 settings.py 中设置
您request.session.get("key")
也可以在任何其他视图中访问。
推荐阅读
- java - 在某些服务中使用 Keytool 重新加载过期证书,但在其他服务中不使用。为什么?
- flutter - Flutter 对 iOS 和 Android 的全平台适应性
- javascript - 双击实现步进器后退按钮问题
- ios - Swift UITableView:如何删除最后一个单元格下的空间
- java - 如何让 Intellj Idea 将依赖项写入 POM 文件?
- c - 当我尝试编译 yacc 和 lex 文件时出现一些错误
- python - sqlite3.operationalError:没有这样的列:sales_id
- python-3.x - 抓取 twitter 数据中的各种特征
- javascript - 如何在 nuxt 中为每种可用语言创建动态链接?
- c++ - 如何正确初始化此指针以避免分段错误?