2012-12-03 11 views
11

Nel documento Django la funzione url è come questoCome posso passare kwargs in URL in Django

url(regex, view, kwargs=None, name=None, prefix='') 

ho questo

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

Questa è la mia vista

class myview(TemplateView): 

    def myfunction(self,request, object_id, **kwargs): 
     model = kwargs['model'] 

Ho ricevuto questo errore

url() got an unexpected keyword argument 'model' 

risposta

17

Si sta tentando di passare un argomento parola chiave model alla funzione url(); è necessario passare a un argomento kwargs invece (ci vuole un dizionario):

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

grazie amico, esattamente quello che voglio – user825904

+0

@jpic Potresti elaborare? – Medorator

+0

@buffer: presumibilmente jpic ritiene [la loro risposta] (http://stackoverflow.com/a/13678956) è l'approccio migliore, poiché esiste un problema di sicurezza del thread. –

8

questo:

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

dovrebbe essere:

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

Vedi docs

Il tuo attuale implementazione non è thread-safe. Per esempio:

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

vi aspettate per stampare 'Foo Nessuno'? Bene fare attenzione perché l'istanza viene condiviso tra le richieste:

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 

Così, quando non è thread-safe, non si può presumere che sarà in uno stato pulito quando la richiesta si avvia - a differenza di quando si utilizza as_view() .

+0

Non so davvero come arrivare a questo. stavo chiedendo qualcos'altro Anche se sto usando la vista generica ma sto chiamando la mia funzione personalizzata – user825904

+0

Vedo, mi chiedo se quello che stai facendo è thread sicuro ... – jpic

+0

cosa vuoi dire per thread sicuro, voglio dire che cosa è il problema con la mia vista – user825904

0

credo che si dovrebbe avere la stessa funzionalità (e di evitare problemi di threading) se avete fatto questo nella vostra views.py

from django.views.generic import TemplateView 
from .models import userModel 

class myview(TemplateView): 
    def myfunction(self, request, object_id, *args, **kwargs): 
     model = userModel 
     # ... Do something with it 
Problemi correlati