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

Posted

技术标签:

【中文标题】Dfango 函数视图 VS 类 RedirectView。如何让类视图接受参数【英文标题】:Dfango function view VS class RedirectView. How to make class view accept arguments 【发布时间】:2018-09-01 22:02:53 【问题描述】:

作为视图的函数知道问题,但类不知道(args,kwargs 来自 url,空,post 方法只有选择,但没有问题)。 两者都有效,但为了添加检查,我想知道如何在课堂上提问。它的 init 或 get_redirect_url 或 request 里面没有像 question_id 这样的东西

url.py

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.py

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,)))

【问题讨论】:

命名的在**kwargs,或者你可以使用self.kwargs,和/或self.args 【参考方案1】:

get_redirect_url 带有 named 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 参数。

背景

如果我们查看"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 参数。

【讨论】:

感谢您的回答和强调。当我尝试打印 args,kwargs,self.request["POST"] 时,它表明 kwargs 的 'pk' 项有我需要的东西! (由于某种原因,kwargs 昨天总是空的)

以上是关于Dfango 函数视图 VS 类 RedirectView。如何让类视图接受参数的主要内容,如果未能解决你的问题,请参考以下文章

Django之视图

Python学习第122天(Django回头看:视图函数redirect模板变量过滤器)

Django - - - -视图层之视图函数(views)

Flask 中的 Render Redirect HttpResponse

Flask 中的 Render Redirect HttpResponse

测试带有 HTTP404 异常的视图函数