【问题标题】:Django, extract kwargs from urlDjango,从 url 中提取 kwargs
【发布时间】:2017-08-29 07:31:48
【问题描述】:

假设我有一个 url 模式

url(r'^/my_app/class/(?P<class_id>\d+)/$', my_class.my_class, name='my_class')

对于给定的网址

http://example.com/my_app/class/3/,我想得到class_id。 我可以自己用正则表达式做到这一点。
我想知道是否有一个实用功能,因为 Django 已经在这样做以将 url 解析为视图。

【问题讨论】:

标签: django


【解决方案1】:

在 Django 文档中有一个使用 resolve() 函数的示例。 next 变量的值有 HTTP url 用 urlparse() / resolve() 解析:

https://docs.djangoproject.com/en/1.11/ref/urlresolvers/#resolve

from django.urls import resolve
from django.http import HttpResponseRedirect, Http404
from django.utils.six.moves.urllib.parse import urlparse

def myview(request):
    next = request.META.get('HTTP_REFERER', None) or '/'
    response = HttpResponseRedirect(next)

    # modify the request and response as required, e.g. change locale
    # and set corresponding locale cookie

    view, args, kwargs = resolve(urlparse(next)[2])
    kwargs['request'] = request
    try:
        view(*args, **kwargs)
    except Http404:
        return HttpResponseRedirect('/')
    return response

【讨论】:

    【解决方案2】:

    如果您使用通用视图或仅使用视图,您可以执行以下操作:

    class myView(View): # or UpdateView, CreateView, DeleteView
        template_name = 'mytemplate.html'
        def get(self, request, *args, **kwargs):
            context = {}
            class_id = self.kwargs['class_id']
    
            # do something with your class_id
    
            return render(request, self.template_name, context)
    
        # same with the post method.
    

    【讨论】:

      【解决方案3】:

      是的,你可以这样做

      def my_class(request, class_id):
          # this class_id is the class_id in url
          # do something;
      

      【讨论】:

        猜你喜欢
        • 2017-12-19
        • 1970-01-01
        • 2015-02-01
        • 2015-01-09
        • 2011-07-12
        • 1970-01-01
        • 2017-11-11
        • 2023-03-29
        • 2018-03-09
        相关资源
        最近更新 更多