programing

장고에서 get, get_queryset, get_context_data를 언제 사용해야 합니까?

lastmoon 2023. 7. 26. 22:20
반응형

장고에서 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방법:

https://github.com/django/django/blob/92053acbb9160862c3e743a99ed8ccff8d4f8fd6/django/views/generic/list.py#L158

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

반응형