我想在投票按钮

时间:2017-08-27 13:55:04

标签: python django

我正在通过浏览Django教程创建一个网站。 我想在我将put投票按钮放入detail.html时加载results.html,但现在index.html已加载.detail.html是

{% extends "polls/base.html" %}
{% load bootstrap3 %}
{% block contents %}

<h1>{{ question.question_text }}</h1>
<!--{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}-->

<form action="{% url 'polls:poll_vote' question.id %}" method="post">
    {% csrf_token %}
    {% bootstrap_form form %}
    <input type="submit" value="Vote" />
</form>
{% endblock %}

当我投票时按钮是这段代码<input type="submit" value="Vote" />, 我想显示results.html。 views.py是

from django.shortcuts import render
from django.urls import reverse_lazy
from django.utils.html import mark_safe
from .models import Question
from django.http import HttpResponse
from django.shortcuts import Http404
from django.shortcuts import get_object_or_404,redirect
from .models import Choice
from django.views.generic import TemplateView
from django.views.generic import DetailView
from django.views.generic import ListView
from .forms import MyForm
from .forms import VoteForm
from django.views.generic import FormView
from django.views.generic.detail import SingleObjectMixin
from django.shortcuts import resolve_url
from django.contrib import messages



# Create your views here.
def index(request):
    return render(request,'polls/index.html',{
        'questions': Question.objects.all(),
    })


def vote(request,pk):
    question = get_object_or_404(Question,pk=pk)
    try:
        selected_choice = question.choice_set.get(pk=request.POST['choice'])
    except (KeyError,Choice.DoesNotExist):
        return render(request,'poll/detail.html',{
            'question':question,
            'error_message':"You didn't select a choice",
        })
    else:
        selected_choice.votes += 1
        selected_choice.save()
        return redirect('index')
    return redirect('poll_results', pk)
    # pass

def results(request,pk):
    obj = get_object_or_404(Question,pk=pk)
    return render(request,'polls/results.html',{
        'question':obj,
    })

class FormTest(FormView):
   form_class = MyForm
   template_name = 'polls/form.html'
   success_url = reverse_lazy('polls:index')
form_test = FormTest.as_view()

class Detail(SingleObjectMixin,FormView):
    model = Question
    form_class = VoteForm
    context_object_name = 'question'
    template_name = 'polls/detail.html'

    def get(self, request, *args, **kwargs):
        self.object = self.get_object()
        return super().post(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        self.object = self.get_object()
        return super().post(request, *args, **kwargs)

    def get_form_kwargs(self):
        kwargs = super().get_form_kwargs()
        kwargs['question'] = self.object
        return kwargs

    def form_valid(self, form):
        form.vote()
        choice = form.cleaned_data['choice']
        messages.success(self.request,'"%s"に投票しました' % choice)
        return super().form_valid(form)

    def get_success_url(self):
        return resolve_url('polls:results',self.kwargs['pk'])

detail = Detail.as_view()

我认为def vote(request,pk)已被阅读,因此return redirect('poll_results', pk)也会被读取而且results.html正在加载。但是我的理想流程没有实现。我写错了目录吗? 目录是 directory

如何解决此问题?return redirect('polls_results', pk)无效。

现在我收到了一个答案, views.py中的投票方法是

def vote(request,pk):
    question = get_object_or_404(Question,pk=pk)
    try:
        selected_choice = question.choice_set.get(pk=request.POST['choice'])
    except (KeyError,Choice.DoesNotExist):
        return render(request,'poll/detail.html',{
            'question':question,
            'error_message':"You didn't select a choice",
        })
    else:
        selected_choice.votes += 1
        selected_choice.save()
        return redirect('index')
    return redirect(reverse('polls_results'), pk=pk)

但发生同样的错误。 民意调查中的urls.py是

from django.conf.urls import url
from django.views.generic import TemplateView
from . import views

app_name="polls"
urlpatterns = [
    url(r'(?P<pk>\d+)/$', views.detail, name='poll_detail'),
    url(r'(?P<pk>\d+)/vote$', views.vote, name='poll_vote'),
    url(r'(?P<pk>\d+)/results$', views.results, name='poll_results'),
    url(r'^$',views.index,name='index'),
    url(r'^form$', views.form_test),
]

2 个答案:

答案 0 :(得分:0)

使用reverse或在redirect方法中写入正确的路径。

示例

 from django.urls import reverse

 def the_view(request):
     # change here
     return redirect(reverse('poll_results'), pk=pk)
     # or
     return redirect('results_url', pk=pk)

编辑:根据您的网址模式,您似乎在reverse方法polls_results中传递了错误的名称,因为您已将其定义为{ {1}}。

您尚未删除poll_results方法中redirect部分代码中的indexelse语句。

vote

参考:https://docs.djangoproject.com/en/1.11/ref/urlresolvers/#reverse

答案 1 :(得分:0)

您似乎正在使用namespaced urls

在这种情况下,只要您使用reverseredirect{% url %},就应该使用命名空间前缀。

return redirect('polls:polls_results', pk=pk)