장고에서 get, get_queryset, get_context_data를 언제 사용해야 합니까?
최근에 기본 보기가 수행하는 작업 이외의 작업을 수행하려면 get 메서드를 재정의해야 한다는 사실을 알게 되었습니다.
class ExampleView(generic.ListView):
template_name = 'ppm/ppm.html'
def get(self, request):
manager = request.GET.get('manager', None)
if manager:
profiles_set = EmployeeProfile.objects.filter(manager=manager)
else:
profiles_set = EmployeeProfile.objects.all()
context = {
'profiles_set': profiles_set,
'title': 'Employee Profiles'
}
그것은 충분히 간단하지만, 언제 사용해야 합니까?get_queryset또는get_context_data위에get제가 보기에 그들은 기본적으로 같은 일을 하는 것처럼 보이거나 아니면 제가 그냥 뭔가를 놓치고 있는 것입니까?그것들을 함께 사용할 수 있습니까?이것은 저에게 큰 혼란의 원인입니다.
다시 한 번 강조하자면:어떤 경우에 나는 극복을 사용합니까?get_queryset또는get_context_data그리고 그 반대는?
그들은 정말로 다른 일을 합니다.
get()
이것은 최상위 방법이며, 각 HTTP 동사마다 하나씩 있습니다.get(),post(),patch()보기에 의해 요청이 처리되기 전 또는 이후에 작업을 수행하려는 경우 이를 재정의할 수 있습니다.그러나 이것은 양식이 제출될 때가 아니라 양식 보기를 처음 로드할 때만 호출됩니다.설명서의 기본 예제입니다.기본적으로 구성된 템플릿을 렌더링하고 HTML을 반환합니다.
class MyView(TemplateView):
# ... other methods
def get(self, *args, **kwargs):
print('Processing GET request')
resp = super().get(*args, **kwargs)
print('Finished processing GET request')
return resp
get_queryset()
사용자ListViews - 표시할 개체 목록을 결정합니다.기본적으로 지정한 모형에 대한 모든 정보가 제공됩니다.이 메서드를 재정의하면 이 논리를 확장하거나 완전히 바꿀 수 있습니다.해당 주제에 대한 장고 문서.
class FilteredAuthorView(ListView):
template_name = 'authors.html'
model = Author
def get_queryset(self):
# original qs
qs = super().get_queryset()
# filter by a variable captured from url, for example
return qs.filter(name__startswith=self.kwargs['name'])
get_context_data()
이 방법은 템플릿 컨텍스트로 사용할 사전을 채우는 데 사용됩니다.예를들면,ListViews에서 결과를 채웁니다.get_queryset()~하듯이author_list위의 예에서템플릿에 표시할 항목을 추가하기 위해 이 방법을 가장 자주 재정의할 수 있습니다.
def get_context_data(self, **kwargs):
data = super().get_context_data(**kwargs)
data['page_title'] = 'Authors'
return data
그런 다음 템플릿에서 이러한 변수를 참조할 수 있습니다.
<h1>{{ page_title }}</h1>
<ul>
{% for author in author_list %}
<li>{{ author.name }}</li>
{% endfor %}
</ul>
이제 여러분의 주요 질문에 답하자면, 여러분이 그렇게 많은 방법을 가지고 있는 이유는 여러분이 여러분의 맞춤형 논리를 핀포인트 정확도로 쉽게 고정할 수 있도록 하기 위해서입니다.코드를 더 읽기 쉽고 모듈식으로 만들 수 있을 뿐만 아니라 테스트도 더 쉽게 수행할 수 있습니다.
그 문서는 모든 것을 설명해야 합니다.아직 충분하지 않다면 출처도 도움이 될 수 있습니다.모든 것이 구획화되어 있기 때문에 가능한 믹스인으로 모든 것이 구현되는 방식을 볼 수 있습니다.
ListView의 기본 구현을 살펴보겠습니다.get방법:
class BaseListView(MultipleObjectMixin, View):
"""
A base view for displaying a list of objects.
"""
def get(self, request, *args, **kwargs):
self.object_list = self.get_queryset()
allow_empty = self.get_allow_empty()
if not allow_empty:
# When pagination is enabled and object_list is a queryset,
# it's better to do a cheap query than to load the unpaginated
# queryset in memory.
if (self.get_paginate_by(self.object_list) is not None
and hasattr(self.object_list, 'exists')):
is_empty = not self.object_list.exists()
else:
is_empty = len(self.object_list) == 0
if is_empty:
raise Http404(_("Empty list and '%(class_name)s.allow_empty' is False.")
% {'class_name': self.__class__.__name__})
context = self.get_context_data()
return self.render_to_response(context)
는 것을 알게 될 것입니다.get_queryset첫 번째 줄에서 호출됩니다.필터링/오더 등을 적용한 후 모델의 쿼리 세트를 반환하려는 경우에는 간단히 덮어쓸 수 있습니다.
전체를 덮어쓸 필요는 없습니다.get페이지화, 404개의 체크 등과 같이 제공된 모든 기능에서 누락될 것이기 때문에 이 방법을 사용할 수 있습니다.
get_context_data페이지 등에 대한 쿼리 문자열 매개 변수와 같은 컨텍스트 데이터와 결과 쿼리 세트를 병합합니다.
제가 추천하는 것은 가끔 django의 소스를 확인하고 당신이 덮어쓰기/교체할 수 있는 가장 적절한 방법을 인식할 수 있도록 약간의 이해를 시도하는 것입니다.
언급URL : https://stackoverflow.com/questions/36950416/when-to-use-get-get-queryset-get-context-data-in-django
'programing' 카테고리의 다른 글
| Hibernate + Java에서는 성능이 느리지만 동일한 기본 Oracle 쿼리와 함께 TOD를 사용하면 성능이 빠름 (0) | 2023.07.26 |
|---|---|
| 표의 다중 제약 조건:모든 위반을 가져오는 방법? (0) | 2023.07.26 |
| javascript window.새 탭의 위치 (0) | 2023.07.26 |
| PHP로 REST API를 구축하려면 프레임워크가 필요합니까? (0) | 2023.07.26 |
| Python의 sys.path는 어디에서 초기화됩니까? (0) | 2023.07.26 |