2012-04-23 25 views
10

Tôi mới với django và tôi đã hoàn thành 4 phần hướng dẫn về djangoproject.comDjango Generic Lần sử dụng trang trí login_required

Vấn đề của tôi là tôi muốn đặt một chứng thực đăng nhập vào ứng dụng các cuộc thăm dò của tôi. Tôi đã sử dụng trang trí @login_required và nó hoạt động đúng nhưng theo views.py của tôi, tôi chỉ có phương thức vote().

views.py tôi dưới "các cuộc thăm dò thư mục"

from django.shortcuts import render_to_response, get_object_or_404 
from django.http import HttpResponseRedirect, HttpResponse 
from django.contrib.auth.decorators import login_required 
from django.views.decorators.cache import never_cache 
from django.core.urlresolvers import reverse 
from django.template import RequestContext 
from polls.models import Poll, Choice 


@login_required 
@never_cache 
def vote(request, poll_id): 
    p = get_object_or_404(Poll, pk=poll_id) 
    try: 
     selected_choice = p.choice_set.get(pk=request.POST['choice']) 
    except (KeyError, Choice.DoesNotExist): 
     return render_to_response('polls/detail.html', { 
      'poll': p, 
      'error_message': "You didn't select a choice.", 
     }, context_instance=RequestContext(request)) 
    else: 
     selected_choice.votes += 1 
     selected_choice.save() 
     return HttpResponseRedirect(reverse('poll_results', args=(p.id,))) 
    return HttpResponse("You're voting on poll %s." % poll_id) 

urls.py tôi dưới "các cuộc thăm dò thư mục"

from django.conf.urls.defaults import patterns, include, url 
from django.views.generic import DetailView, ListView 
from polls.models import Poll 

urlpatterns = patterns('', 
    url(r'^$', 
     ListView.as_view(
      queryset = Poll.objects.order_by('-pub_date')[:5], 
      context_object_name = 'latest_poll_list', 
      template_name = 'polls/index.html'), name='poll_lists'), 
    url(r'^(?P<pk>\d+)/$', 
     DetailView.as_view(
      model = Poll, 
      template_name = 'polls/detail.html'), name='poll_details'), 
    url(r'^(?P<pk>\d+)/results/$', 
     DetailView.as_view(
      model = Poll, 
      template_name = 'polls/results.html'), name = 'poll_results'), 
    url(r'^(?P<poll_id>\d+)/vote/$', 'polls.views.vote'), 
) 

dưới urls.py của tôi, tôi có sử dụng quan điểm chung.

Sự cố là: làm cách nào để đặt thông tin đăng nhập bắt buộc trong "chỉ mục" của ứng dụng thăm dò ý kiến. Vì vậy, người dùng sẽ đăng nhập trước khi họ có thể xem các cuộc thăm dò có sẵn.

Hiện tại là: Tôi đã sử dụng thông tin đăng nhập bắt buộc theo views.py và phương thức bỏ phiếu của mình(), Nó sẽ yêu cầu đăng nhập sau khi bỏ phiếu.

có ai có thể giúp tôi không?

Cảm ơn, Justin

Trả lời

22

cách tiếp cận 1nd

Trong urls.py:

urlpatterns = patterns('', 
    url(r'^$', 
     login_required(ListView.as_view(
      queryset = Poll.objects.order_by('-pub_date')[:5], 
      context_object_name = 'latest_poll_list', 
      template_name = 'polls/index.html'), name='poll_lists')), 
) 

cách tiếp cận thứ 2

Trong views.py:

class IndexView(ListView): 
    queryset = Poll.objects.order_by('-pub_date')[:5] 
    context_object_name = 'latest_poll_list' 
    template_name = 'polls/index.html' 

    @method_decorator(login_required) 
    def dispatch(self, request, *args, **kwargs):   
     return super(IndexView, self).dispatch(request, *args, **kwargs) 

sau đó trong urls.py

urlpatterns = patterns('', 
     url(r'^$', 
      IndexView.as_view(), name='poll_lists'), 
    ) 
+0

Caught ImportError khi render: không thể nhập tên ListVieiw << Tôi nhận được lỗi này khi tôi sử dụng urls.py câu trả lời của bạn – justin

+0

tôi cập nhật câu trả lời của tôi – San4ez

+0

tôi nhận được cùng một lỗi, tôi làm theo cách tiếp cận thứ hai – justin

Các vấn đề liên quan