사용자 지정 클래스 기반보기가 있습니다.
# 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'),
이 경우 뷰에 전달 된 매개 변수가 반드시 View 클래스의 인스턴스 변수 일 필요는 없습니다. 이 방법을 사용하면 기본 페이지 이름을 YourView 모델에 하드 코딩 할 필요가 없지만 urlconf에서 매개 변수로 전달할 수 있습니다.
답변
에서 언급 한 바와 같이 야로슬라프 Nikitenko 당신이보기 클래스에 새로운 인스턴스 변수를 하드 코딩하지 않으려면, 당신은 수있는 기능을 볼 수있는 추가 옵션 통과 에서 urls.py
이 같은를 :
url(r'^$', YourView.as_view(), {'slug': 'hello_world'}, name='page_name')
보기에서 사용 방법을 추가하고 싶었습니다. 다음 방법 중 하나를 구현할 수 있습니다.
# 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
답변
장고 3.0의 경우 이것이 저에게 효과적이었습니다.
# myapp/views.py
from django.views.generic import DetailView
class MyView(DetailView):
template_name = 'detail.html'
slug = None
def get_object(self, queryset=None):
self.slug = self.kwargs.get('slug', None)
return queryset.get(slug=self.slug)
# myapp/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('slug/<slug:slug>/', views.MyView.as_view(), name='myview_by_tag'),
]