首页 > 解决方案 > 如何存储数据并在另一个视图中显示它们?姜戈

问题描述

我有一个简单的体育赛事应用程序。我以用户身份登录,我有一个可以加入的活动列表。当我加入事件时,成员值 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%}

标签: djangoview

解决方案


您可以使用会话

要保存您的数据,请使用: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")也可以在任何其他视图中访问。


推荐阅读