django
  • python-2.7
  • python-2.x
  • django-generic-views
  • django-1.4
  • 2013-02-09 1 views 1 likes 
    1

    urls.pydjango : 변수를 클래스에 전달하는 방법은 무엇입니까?

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

    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

    하지만, '이름은'아무도 없습니다 ...

    '이름'받는 방법? 어떻게해야합니까?

    편집 ----- 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) 
    

    난 당신이 대답 코드를 적용 할 수 있습니다.

    그런 다음 나는

    어떻게해야합니까 ... 'PK'

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

    그래서 내가 필요로하는 오류를 얻을?

    +0

    두 번째 문제를 해결하기위한 답을 업데이트했습니다. –

    답변

    1

    self.kwargs['name']으로 매개 변수에 액세스 할 수 있어야합니다. 또한 get_queryset은 대신 쿼리 세트를 반환해야합니다.

    DetailView 일반보기를 사용하려면 URL에 name 대신 pk을 사용해야합니다. 그 후에 customerDetailView 클래스에 model = Customerslug_field = 'name'을 정의하기 만하면 작동합니다. self.kwargs['name']에 액세스하지 않아도됩니다. 에 의해 get_object

    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 
    

    또는 오버라이드 (override) :

    def get_object(self): 
        return get_object_or_404(Customer, name=self.kwargs['name']) 
    
    당신이 정말이 URL에 <name>을 사용하려면 [source]

    은 또한 slug_field = 'name' 이외에 name-slug_url_kwarg을 (변경해야

    slug_fieldslug_url_kwarg을 수업에 수정하지 않고

    +0

    고마워요.하지만 mycode는 여전히 깨지 ... – chobo

    +0

    나는 'pk'를 얻고 싶습니다. 그래서 'self.pk = Customer.objects.get (name = self.name) .pk'-이 코드는 __init__을 넣습니다. 하지만 여전히 깨지 ... – chobo

    +0

    @chobo 지금 어떤 오류가 있습니까? –

     관련 문제

    • 관련 문제 없음^_^