Dfango函数视图VS类RedirectView。如何使类视图接受参数

问题描述 投票:1回答:1

作为一个视图的函数知道问题,但类没有(args,kwargs来自url,空,post方法只有选择,但不是问题)。两者都有效,但是为了增加支票,我想知道如何在课堂上提问。它的init或get_redirect_url或者请求里面没有像question_id那样的内容

URL.朋友

from django.urls import path
from . import views
app_name = 'polls'
ulrpatterns=[
    path('<int:question_id>/vote/', views.vote, name='vote'),
    path('<int:pk>/vote0/', views.vote0.as_view(), name='vote0'),
]

views.朋友

class vote0(generic.base.RedirectView):
    pattern_name = 'polls:results'
    def get_redirect_url(self, *args, **kwargs):
        selected_choice = get_object_or_404(Choice, pk(self.request.POST['choice']))
        selected_choice.votes +=1
        selected_choice.save()
        return super().get_redirect_url(*args, **kwargs)


def vote(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    selected_choice = question.choice_set.get(pk=request.POST['choice'])
    selected_choice.votes += 1
    return HttpResponseRedirect(reverse('polls:results', args=(question.id,)))
python django generics view
1个回答
1
投票

get_redirect_url提供了命名的URL参数(**kwargs),因此您可以重写签名以捕获这些参数。例如:

class vote0(generic.base.RedirectView):
    pattern_name = 'polls:results'

    def get_redirect_url(self, *args, question_id=None, **kwargs):
        question = get_object_or_404(Question, pk=question_id)
        selected_choice = question.choice_set.get(pk=request.POST['choice'])
        selected_choice.votes +=1
        selected_choice.save()
        return super().get_redirect_url(*args, **kwargs)

或者您可以访问self.args中的位置URL参数,以及self.kwargs中的命名URL参数。

Background

如果我们看看"derived"实现,我们会看到如果我们构建一个RedirectView就像一个普通的视图,它看起来像:

class RedirectView(View):

    # ...

    def get(self, request, *args, **kwargs):
        url = self.get_redirect_url(**kwargs)
        if url:
            if self.permanent:
                return http.HttpResponsePermanentRedirect(url)
            else:
                return http.HttpResponseRedirect(url)
        else:
            logger.warning('Gone: %s', self.request.path,
                        extra={
                            'status_code': 410,
                            'request': self.request
                        })
            return http.HttpResponseGone()

    def post(self, request, *args, **kwargs):
        return self.get(request, *args, **kwargs)

因此,调度员将直接调用post(简单地包裹get)或getget(..)函数将调用并传递**kwargs参数。

© www.soinside.com 2019 - 2024. All rights reserved.