Переменная сессии не обновляется во время сеанса в django
Я новичок в веб-разработке и пытаюсь создать сайт аукциона в качестве курсового проекта. Я пытаюсь создать список просмотра для конкретного пользователя. Я могу добавить товар в список, но когда я хочу удалить товар из списка, он не удаляется, пока я не выйду из системы и не войду снова. Вот мой код:
views.py:
def watchlist(request, item_id=None):
if request.method == "POST":
for item in request.session["watchlist"]:
if item["id"] == item_id:
ind = request.session["watchlist"].index(item)
modified = request.session["watchlist"][:ind] +
request.session["watchlist"][ind + 1:]
request.session["watchlist"] = modified
break
data = request.session["watchlist"]
return render(request, "auctions/watchlist.html", {
"data": data
})
watchlist.html:
{% block body %}
{% if user.is_authenticated %}
<h2>Watchlist</h2>
<ol>
{% for item in data %}
<li>
<div style="display: flex;">
<div>
<img src="{{ item.image_url }}" alt="No image">
</div>
<div>
<a href="{% url 'listing' item.id %}"><h4>{{ item.title }}</h4></a>
</div>
<div>
Current Price: {{ item.current_price }}
</div>
<div>
<form action="{% url 'watchlist_del' item.id %}" action="post">
<input type="submit" value="Delete">
</form>
</div>
</div>
<div style="border-bottom: 1px solid black;"></div>
</li>
{% empty %}
<h1>No items in watchlist</h1>
{% endfor %}
</ol>
{% endif %}
{% endblock %}
Я проверил данные сессии через Django-admin и обнаружил, что даже после удаления элемента его данные не удаляются из request.session["watchlist"]
. Они обновляются только после того, как я вхожу в систему и выхожу из нее снова.
Мне удалось решить проблему, заменив форму в файле watchlist.html на тег <a>
.
watchlist.html:
<div>
<a href="{% url 'watchlist_del' item.id %}">Delete from watchlist</a>
</div>
views.py
def watchlist(request, item_id=None):
if item_id is not None:
for item in request.session["watchlist"]:
if item["id"] == item_id:
ind = request.session["watchlist"].index(item)
modified = request.session["watchlist"][:ind] + request.session["watchlist"][ind + 1:]
request.session["watchlist"] = modified
break
data = request.session["watchlist"]
return render(request, "auctions/watchlist.html", {
"data": data
})
но я все еще задавался вопросом, почему возникла проблема. Была ли проблема с почтовым запросом? Пожалуйста, поясните. Спасибо.
Your form should specify post
as method=…
attribute [mdn-doc], not as action=…
attribute [mdn-doc], and will requires a CSRF-token, so:
<form action="{% url 'watchlist_del' item.id %}" method="post"> {% csrf_token %} <input type="submit" value="Delete"> </form>
Ваша логика представления может быть упрощена с помощью понимания списка:
def watchlist(request, item_id=None):
if request.method == 'POST':
request.session['watchlist'] = [
item for item in request.session['watchlist'] if item['id'] != item_id
]
data = request.session['watchlist']
return render(request, 'auctions/watchlist.html', {'data': data})
Note: In case of a successful POST request, you should make a
redirect
[Django-doc] to implement the Post/Redirect/Get pattern [wiki]. This avoids that you make the same POST request when the user refreshes the browser.
принудительное обновление сессии после каждого обновления
# Set session as modified to force data updates/cookie to be saved.
request.session.modified = True