2017-08-27 67 views
0

我正在通过看Django教程制作一个网站。 我想负荷results.html当我把投票按钮在detail.html,但现在的index.html是loaded.detail.html是我想加载results.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是load.But我理想的流量是不是realized.Was我错写的目录? 目录是 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), 
] 
+0

请创建一个[mcve]。这里不可能说出什么问题。你应该包含你的'urls.py',并且不要包含不相关的视图函数。 –

+0

@HåkenLid对不起,我收录了我的urls.py,如果你知道的话请告诉我。 – user8504021

+0

另外,发布错误追溯。说它没有用,似乎没有帮助确定问题。 –

回答

0

看来你正在使用namespaced urls

在这种情况下,无论何时使用reverse,redirect{% url %},都应该使用命名空间前缀。

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

我写了return poll(reverse('polls:poll_results'),pk = pk),但NoReverseMatch在/ polls/1/vote 没有找到参数的'poll_results'反转。尝试1个模式:['polls /(?P \\ d +)/ results $'] error occurred。 – user8504021

+0

当我使用return redirect('polls:polls_results'pk = pk)时,会发生语法错误。 – user8504021

+0

我该怎么办? – user8504021

0

使用reverseredirect方法写的正确路径。

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) 

编辑:基于您的URL模式,似乎你在reverse方法,polls_results,在那里,你已经定义它是作为poll_results传递错误的名称。

您还没有删除redirectindex陈述elsevote方法中的部分代码。

def vote(request, pk): 
    # your code 
    else: 
     # save to model 
     # remove redirect statement here 
    return redirect(reverse('poll_results'), pk=pk) 

编号:https://docs.djangoproject.com/en/1.11/ref/urlresolvers/#reverse

+0

我更新了我的问题,如果我误解了你的答案,请告诉我。 – user8504021

+0

更新了我的答案。 –

+0

我试过了我们的代码,但仍然显示index.html ...我该怎么做? – user8504021