1

클래스 기반 뷰를 이해할 수 없어 예를 들어 설명하려고합니다.Django 클래스 기반 뷰 예제

#urls.py 
url(r'^(?P<langcode>[a-zA-Z-]+/about/$', about, name='about') 


#views.py 
def about(request, langcode): 
    languages = Language.objects.values_list('code', flat=True) 
    language = get_object_or_404(Language, pk=langcode) 
    return render(request, 'about.html', { 
     'languages': languages, 
     'language': language 
    }) 

가 나는 또한 about의 첫 2 선 포함 된 일부 다른 기능 전망이 : 여기에 지금까지 무엇을 가지고 그래서

languages = Language.objects.values_list('code', flat=True) 
language = get_object_or_404(Language, pk=langcode) 

, 내가 지금 무엇을 원하는 것은 :

  1. 는 만들 class BaseView (또는 당신이 그것을 호출하려는 그러나) django.generic.views에서 뭔가를 확장하는과 0을 결정하는 langcode 입력 파라미터

  2. 생성에 기초하여 컨텍스트 12,및 languages 파라미터 class AboutView(BaseView) (따라서 연장 BaseView) 어떤 식 으로든 렌더링에 사용되는 템플릿 이름 about.html을 정의한다.

  3. I 것 더 또한 BaseView을 연장 AboutView에 simillar하지만, 어느 것이 region 불리는 하나 개 이상의 컨텍스트 파라미터는 langcode 입력 파라미터 에서뿐만 따라 설정되는, 다른 클래스에 기초하여 뷰를

수 누군가 나에게 정확히이 물건을 코딩하는 법을 보여 줍니까?

당신은 먼저 TemplateView 일반적인 뷰 사용하여 일반적인 논리를 정의 : : 여기 당신이 원하는 것을 달성 할 수있는 간단한 방법 당신에게

답변

2

감사합니다 그리고

class MyBaseView(TemplateView): 
    def dispatch(self, request, *args, **kwargs): 
     # dispatch takes care of "reading" the parameters from the url 
     self.language = get_object_or_404(Language, pk=kwargs.pop("langcode")) # I would use some kind of default value to prevent exception, but its up to your logic 
     return TemplateView.dispatch(self, request, *args, **kwargs) 

    def get_context_data(self, **kwargs): 
     # get_context_data creates the context 
     context = TemplateView.get_context_data(self, **kwargs) 
     context.update({"language": self.language, 
         "languages": Language.objects.values_list('code', flat=True)}) 

     return context 

, 당신은 심지어 AboutView 필요하지 않습니다 당신이 원하는 모든 그래서 당신의 urls.py에서 TEMPLATE_NAME을 제어 할 수 있기 때문에 :

# in urls,py you can just use this, instead of defining an AboutView, you pass the template_name you want to use, this is sufficient because TemplateView expects a template_name attribute 
url('^(?P<langcode>[a-zA-Z]+)/about/$', MyBaseView.as_view(template_name="about.html"), name='about') 

region 당신은 그냥 할 수있는 마지막으로, 다른 뷰에 대해 그 사용 MyBaseView에서 원하는 항목을 추가하고 원하는 컨텍스트를 추가하십시오.

class AboutViewWithRegion(MyBaseView): 
    def get_context_data(self, **kwargs): 
     context = MyBaseView.get_context_data(self, **kwargs) 
     context.update({"region": <<your logic here>>}) 
     return context 

희망이 있습니다!