1

urls.pydjango: Как передать переменную классу?

url(r'^customer/(?P<name>[^\s]+)/$', customerDetailView.as_view(), name="customerDetailView"), #pass 'name' variable 

и

views.py

class customerDetailView(DetailView): 
    context_object_name = 'customerDetail' 
    template_name = "customer.html" 
    allow_empty = True 

    def __init__(self, name=None, *args): 
     self.name = name # name is 'None'... Why...? 

    def get_queryset(self): 
     return Customer.objects.get(name=self.name) 

Я просто прошу '192.168.1.5/customer/abc/', но 'имя' является не ...

Как получить 'имя'? Что мне делать?

редактировать -----

views.py

class customerDetailView(DetailView): 
    context_object_name = 'customerDetail' 
    template_name = "customer.html" 
    allow_empty = True 
    """ 
    def __init__(self, **kwargs): 
     import pdb;pdb.set_trace() 
     self.name = kwargs['name'] 
    """ 
    def get_queryset(self): 
     # import pdb;pdb.set_trace() 
     self.name = self.kwargs['name'] # Thanks Kay Zhu!! 
     return Customer.objects.get(name=self.name) 

прилагаю код, который вы ответили.

Затем я получаю ошибку

Generic detail view customerDetailView must be called with either an object pk or a slug. 

Так что мне нужно 'рк' ...

Что я должен делать?

+0

Я обновил ответ, чтобы решить вторую проблему. –

ответ

1

У вас должен быть доступ к параметру с помощью self.kwargs['name']. Кроме того, get_queryset должен возвращать запрос.

Вы также должны использовать pk вместо name в своем URL-адресе, если хотите использовать общий вид DetailView. После этого вам нужно всего лишь определить model = Customer и slug_field = 'name' в вашем классе customerDetailView, и он должен работать. Вам совсем не обязательно обращаться к self.kwargs['name']. [source]

Если вы действительно хотите использовать <name> в вашем URL, также необходимо изменить slug_url_kwarg к name (в дополнение к slug_field = 'name':

class customerDetailView(DetailView): 
    context_object_name = 'customerDetail' 
    template_name = "customer.html" 
    allow_empty = True 
    model = Customer 
    slug_field = 'name' 
    slug_url_kwarg = 'name' 
    # no need to override any methods here 

или переопределить get_object по:

def get_object(self): 
    return get_object_or_404(Customer, name=self.kwargs['name']) 

без изменения slug_field и slug_url_kwarg в вашем классе.

+0

спасибо ... но mycode все еще ломается ... – chobo

+0

Я хочу получить «pk». so 'self.pk = Customer.objects.get (name = self.name) .pk' <- Этот код помещает __init__. но все равно перерыв ... – chobo

+0

@chobo Какую ошибку вы получаете сейчас? –

Смежные вопросы