/ / Djangoメッセージが更新される代わりに繰り返される-python、django、django-models、django-templates、django-views

更新する代わりにそれ自体を繰り返すDjangoメッセージ-python、django、django-models、django-templates、django-views

classinfo = EventType.objects.all()
length = EventType.objects.all().count()
for i in range(length):
messages.success(request, classinfo[i])

そこで、これを使用して、EventTypeにあるすべてのイベントのリストを印刷しています。

画像

これはどのように見えるかです。 ただし、クラスの追加機能を使用してリストに別のアイテムを追加すると、元のリストが再度繰り返され、追加のイベントが追加されます。ただし、この後に別のイベントを追加すると、リストに適切に追加されます。イベントを追加するときに最初のリストを繰り返さないように、どうすれば修正できますか?

イベントを追加したときの現在の様子

HTMLは次のようになります。

{% for message in messages %}
<li>
{{ message }}
</li>
{% endfor %}

回答:

回答№1は0

デフォルトでは、DjangoはFallbackStorageクラスを使用します。つまり、最初にCookieStorageを使用してメッセージを保存します。 Cookieが2KBを超えない限り、すべてのメッセージがCookieに保存されます。あなたがしているのは、リクエストを実行するときにメッセージを作成することです。これらのメッセージはすべてクッキーに保存されます。次に、イベントを追加して、別のリクエストを作成します。その後、ビューはすべてのEventTypeを再度ループし、最初の要求からのCookieの元のコンテンツと共にCookieに追加します。適切に、おそらくあなたはクッキーのサイズ制限にあり、既存のコンテンツをドロップします。

本当にメッセージを保存する必要がありますか? メッセージはロギングメカニズムとして使用されます。モデルを反復処理するためにメッセージを使用していますが、これは不要です。 classinfoをコンテキストディクショナリに渡し、メッセージの代わりにそれを反復処理するだけです。

view.py:

classinfo = EventType.objects.all()

template.html:

{% for event in classinfo %}
<li>{{ event }}</li>
{% endfor %}

さらに良いのは、単にDjangoのListViewを使用することです。まさにこれが目的です。

class EventListView(ListView):
model = EventType