Django 클래스 기반보기 : as_view 메소드에 추가 매개 변수를 어떻게 전달합니까?
사용자 지정 클래스 기반보기가 있습니다.
# myapp/views.py
from django.views.generic import *
class MyView(DetailView):
template_name = 'detail.html'
model = MyModel
def get_object(self, queryset=None):
return queryset.get(slug=self.slug)
다음과 같이 슬러그 매개 변수 (또는 다른 매개 변수)를 뷰에 전달하고 싶습니다.
MyView.as_view(slug='hello_world')
이렇게하려면 메서드를 재정의해야합니까?
urlconf가 다음과 같은 경우 :
url(r'^(?P<slug>[a-zA-Z0-9-]+)/$', MyView.as_view(), name = 'my_named_view')
그러면 다음과 같이보기 함수 (예 : 'get_queryset') 내에서 슬러그를 사용할 수 있습니다.
self.kwargs['slug']
as_view
메서드에 전달되는 모든 매개 변수는 View 클래스의 인스턴스 변수입니다. 즉 slug
, 매개 변수 로 추가 하려면 하위 클래스에서 인스턴스 변수로 만들어야합니다.
# myapp/views.py
from django.views.generic import DetailView
class MyView(DetailView):
template_name = 'detail.html'
model = MyModel
# additional parameters
slug = None
def get_object(self, queryset=None):
return queryset.get(slug=self.slug)
MyView.as_view(slug='hello_world')
작동 해야 합니다.
키워드를 통해 변수를 전달하는 경우 Erikkson이 제안한 내용을 사용 하십시오 . https://stackoverflow.com/a/11494666/9903
get_object()
키워드 인수로 전달 된 슬러그를 기반으로 객체를 조회하기 위해 재정의 할 필요가 없다는 점은 주목할 가치가 있습니다 . https://docs.djangoproject.com/en/1.5/ref/ 의 속성을 사용할 수 있습니다. SingleObjectMixin
class-based-views / mixins-single-object / # singleobjectmixin
# views.py
class MyView(DetailView):
model = MyModel
slug_field = 'slug_field_name'
slug_url_kwarg = 'model_slug'
context_object_name = 'my_model'
# urls.py
url(r'^(?P<model_slug>[\w-]+)/$', MyView.as_view(), name = 'my_named_view')
# mymodel_detail.html
{{ my_model.slug_field_name }}
(모두 slug_field
및 slug_url_kwarg
기본값은 'slug'
)
템플릿의 컨텍스트에 개체를 get_context_data
추가하려면 해당 컨텍스트에 재정의 하고 추가 할 수 있습니다 . request.user 가 필요한 경우 요청은 self 의 일부이기도합니다 .
def get_context_data(self, **kwargs):
context = super(MyTemplateView, self).get_context_data(**kwargs)
if 'slug' in self.kwargs:
context['object'] = get_object_or_404(MyObject, slug=self.kwargs['slug'])
context['objects'] = get_objects_by_user(self.request.user)
return context
urls.py https://docs.djangoproject.com/en/1.7/topics/http/urls/#passing-extra-options-to-view-functions 에서 매개 변수를 전달할 수 있습니다.
이것은 일반보기에서도 작동합니다. 예:
url(r'^$', views.SectionView.as_view(), { 'pk': 'homepage', 'another_param':'?'}, name='main_page'),
In this case the parameters passed to the view should not necessarily be instance variables of the View class. Using this method you don't need to hardcode default page name into YourView model, but you can just pass it as a parameter from urlconf.
As stated by Yaroslav Nikitenko, if you don't want to hardcode a new instance variable to the View class, you can pass extra options to view functions from urls.py
like this:
url(r'^$', YourView.as_view(), {'slug': 'hello_world'}, name='page_name')
I just wanted to add how to use it from the view. You can implement one of the following methods:
# If slug is optional
def the_function(self, request, slug=None):
# use slug here
# if slug is an optional param among others
def the_function(self, request, **kwargs):
slug = kwargs.get("slug", None)
other_param = kwargs.get("other_param", None)
# If slug is required
def the_function(self, request, slug):
# use slug here
'IT story' 카테고리의 다른 글
SQL에서 StringBuilder를 사용하는 올바른 방법 (0) | 2020.09.08 |
---|---|
ASP.NET Web Api : 요청 된 리소스가 http 메서드 'GET'을 지원하지 않습니다. (0) | 2020.09.08 |
BOM으로 UTF-8 파일을 검색하는 우아한 방법? (0) | 2020.09.08 |
Sublime 2 업데이트 알림을 끄는 방법은 무엇입니까? (0) | 2020.09.08 |
CG_CONTEXT_SHOW_BACKTRACE 환경 변수를 어떻게 설정할 수 있습니까? (0) | 2020.09.08 |