Как отобразить выбранный вариант опроса вместе с общими результатами в Django - PullRequest
0 голосов
/ 06 апреля 2020

Я новичок в Python & Django, и я следую руководству по приложению, которое есть в документации Django.

Я создал маршруты, и все работает, проблема, с которой я столкнулся, заключается в том, что я хочу показать, какой вариант опроса пользователь выбрал на странице результатов. (Страница результатов в настоящее время показывает только общий результат опроса, который я хочу сохранить, но я также хочу показать выбранный вариант в дополнение к этому.) Пользователю не нужно входить в систему, поэтому я не создал внешний ключ для t ie пользователя для его голосования.

Я нашел способ добавить выбранный первичный ключ выбора в URL, но, поскольку я использую представления на основе классов, я не уверен, как чтобы получить это значение в представлении результатов.

urls.py

...
app_name = "polls"
    urlpatterns = [
        path('', views.IndexView.as_view(), name='index'),
        path('<int:pk>/', views.DetailView.as_view(), name='detail'),
        path('<int:pk>/results/<int:choice_id>', views.ResultsView.as_view(), name='results'),
        path('<int:question_id>/vote/', views.vote, name='vote'),
    ]

...

views.py

def vote(request, question_id):
        question = get_object_or_404(Question, pk=question_id)
        try:
            selected_choice = question.choice_set.get(pk=request.POST['choice'])
        ... #removed the test part
        else:
            selected_choice.votes += 1
            selected_choice.save()                
            return HttpResponseRedirect(reverse('polls:results', args=(question.id, selected_choice.id)))


class ResultsView(generic.DetailView):
    model = Question
    template_name = 'polls/results.html'

1 Ответ

0 голосов
/ 06 апреля 2020

Вы можете перезаписать get_contect_data, как, например, в документации :

class ResultsView(generic.DetailView):
    model = Question
    template_name = 'polls/results.html'
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['choice'] = kwargs['choice_id']
        return context

Затем вы можете использовать тег {{choice}} в своем шаблоне

Однако я думаю, что лучше хранить такие переменные в пользовательском сеансе (анонимном).

Сохранить значение в сеансе:

def vote(request, question_id):
        question = get_object_or_404(Question, pk=question_id)
        try:
            selected_choice = question.choice_set.get(pk=request.POST['choice'])
        ... #removed the test part
        else:
            selected_choice.votes += 1
            selected_choice.save()
            request.session['choice'] = selected_choice.id # here we are saving value to session   
            return HttpResponseRedirect(reverse('polls:results', args=(question.id)))

class ResultsView(generic.DetailView):
    model = Question
    template_name = 'polls/results.html'

Теперь вы можете получить доступ к request.session.choice в любом месте:

Например, в шаблоне используйте тег {{request.session.choice}}.

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