Сохранение объекта из ListView в django - PullRequest
1 голос
/ 05 августа 2020

У меня есть общий c ListView, который отображает все объекты из модели, и я хотел бы, чтобы пользователи могли выбирать один объект для дальнейшей обработки, сохраняя его в сеансе или в другой модели. Как лучше всего go сообщить об этом?

views.py

class TranscriptListView(generic.ListView):
    model = Transcript
    template_name = 'transcript_list.html'

template

{% block content %}
<ul>
    {% for transcript in transcript_list %}
    <li>
        <a href="{{ transcript.get_absolute_url }}">{{transcript.name}}</a>
        <p>{{transcript.text}}</p>
    </li>
    {% endfor %}
</ul>

1 Ответ

1 голос
/ 05 августа 2020

Чтобы выбрать что-то для сохранения в сеансе, я бы просто сделал

class SelectTranscriptView(SingleObjectMixin, View):
    model = Transcript

    def post(self, request, *args, **kwargs):
        object = self.get_object()
        request.session['selected_transcript'] = object.id
        return redirect(...)

Это представление принимает только POST, поскольку запросы GET должны быть идемпотентными, то есть они не должны изменять какое-либо состояние. Установка значения сеанса определенно изменяет состояние. Это означает, что вам нужно будет использовать форму (или функцию JavaScript) для отправки данных POST на URL-адрес, к которому вы это подключили.

Что еще более важно: Установка чего-либо в сеанс вовсе не обязательно хорошая идея. Представьте, что опытный пользователь решает открыть несколько вкладок на вашем сайте и пытается выбрать одну расшифровку для одной вкладки, а другую - для другой вкладки. Это будет невозможно, если вы сохраните выбранную вещь в сеансе! Вместо этого я бы разработал такие вещи, чтобы идентификатор редактируемого или просматриваемого объекта всегда был в URL-адресе (в любом случае, как происходит с DetailViews и им подобными).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...