如何在django中传递URL中的kwargs

Ran*_*ngh 14 python django

在django doc中,url函数是这样的

url(regex, view, kwargs=None, name=None, prefix='')
Run Code Online (Sandbox Code Playgroud)

我有这个

url(r'^download/template/(?P<object_id>\d+)/$', views.myview().myfunction,model=models.userModel, name="sample")
Run Code Online (Sandbox Code Playgroud)

这是我的观点

class myview(TemplateView):

    def myfunction(self,request, object_id, **kwargs):
        model = kwargs['model']
Run Code Online (Sandbox Code Playgroud)

我收到这个错误

url() got an unexpected keyword argument 'model'
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 19

您正在尝试将model关键字参数传递给该url()函数; 你需要传入一个kwargs参数(它需要一个字典):

url(r'^download/template/(?P<object_id>\d+)/$', views.myview().myfunction, 
    kwargs=dict(model=models.userModel), name="sample")
Run Code Online (Sandbox Code Playgroud)


jpi*_*pic 8

这个:

url(r'^download/template/(?P<object_id>\d+)/$', views.myview().myfunction,model=models.userModel, name="sample")
Run Code Online (Sandbox Code Playgroud)

应该:

url(r'^download/template/(?P<object_id>\d+)/$', views.myview.as_view(model=models.userModel), name="sample")
Run Code Online (Sandbox Code Playgroud)

查看文档

您当前的实现不是线程安全的.例如:

from django import http
from django.contrib.auth.models import User
from django.views import generic


class YourView(generic.TemplateView):
    def __init__(self):
        self.foo = None

    def your_func(self, request, object_id, **kwargs):
        print 'Foo', self.foo
        self.foo = 'bar'
        return http.HttpResponse('foo')



urlpatterns = patterns('test_app.views',
    url(r'^download/template/(?P<object_id>\d+)/$', YourView().your_func,
        kwargs=dict(model=User), name="sample"),
)
Run Code Online (Sandbox Code Playgroud)

你期望它打印'Foo None '吗?请小心,因为实例在请求之间共享:

Django version 1.4.2, using settings 'django_test.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
Foo None
[03/Dec/2012 08:14:31] "GET /test_app/download/template/3/ HTTP/1.1" 200 3
Foo bar
[03/Dec/2012 08:14:32] "GET /test_app/download/template/3/ HTTP/1.1" 200 3
Run Code Online (Sandbox Code Playgroud)

因此,当它不是线程安全时,您不能假设它在请求开始时将处于干净状态 - 与使用as_view()时不同.