작성
·
609
0
해당 부분에서 get_object() 함수가 user 객체의 데이터를 가져오는 것은 디버깅을 통해서 확인했습니다.
궁금한 건, class 내부에서 get_object() 함수를 호출하게 될 때 무조건 user 의 데이터를 가져오는 것인가요?
해당 클래스 내부에 form class 객체도 있는데 user 객체를 가져오는 것은 어떤 방식으로 처리되는 건지 궁금합니다...
뭔가 명시적으로 user 의 데이터를 가져오도록 하는 부분이 없는 것 같아서요...ㅠㅜ
답변 1
0
안녕하세요!
강좌 계속 잘 들어주셔서 감사합니다.
질문 확인했습니다.
일단 해당 메서드가 어떻게 동작하는지 확인하기 위해서 가장 좋은 방법은,
해당 메서드를 뜯어보는거죠!
그래서 일단 해당 메서드의 내용을 가져왔습니다.
class SingleObjectMixin(ContextMixin):
"""
Provide the ability to retrieve a single object for further manipulation.
"""
model = None
queryset = None
slug_field = 'slug'
context_object_name = None
slug_url_kwarg = 'slug'
pk_url_kwarg = 'pk'
query_pk_and_slug = False
def get_object(self, queryset=None):
"""
Return the object the view is displaying.
Require `self.queryset` and a `pk` or `slug` argument in the URLconf.
Subclasses can override this to return any object.
"""
# Use a custom queryset if provided; this is required for subclasses
# like DateDetailView
if queryset is None:
queryset = self.get_queryset()
# Next, try looking up by primary key.
pk = self.kwargs.get(self.pk_url_kwarg)
slug = self.kwargs.get(self.slug_url_kwarg)
if pk is not None:
queryset = queryset.filter(pk=pk)
# Next, try looking up by slug.
if slug is not None and (pk is None or self.query_pk_and_slug):
slug_field = self.get_slug_field()
queryset = queryset.filter(**{slug_field: slug})
# If none of those are defined, it's an error.
if pk is None and slug is None:
raise AttributeError(
"Generic detail view %s must be called with either an object "
"pk or a slug in the URLconf." % self.__class__.__name__
)
try:
# Get the single item from the filtered queryset
obj = queryset.get()
except queryset.model.DoesNotExist:
raise Http404(_("No %(verbose_name)s found matching the query") %
{'verbose_name': queryset.model._meta.verbose_name})
return obj
장고와 같은 오픈소스 프레임워크의 가장 좋은 점은,
역시 소스코드가 공개되어있다는거죠.
의문이 있다면 해당 소스코드를 들여다보고 파악할 수 있습니다.
그래서 간단하게 해당 메서드를 요약해드리자면,
저희가 강좌에서 하는 내용을 조금 체계적으로 만들어놓은? 느낌입니다.
1. 전체 쿼리셋을 가져옵니다.
2. pk , 입력된 primary key를 가져옵니다.
3. 해당 pk를 통해 queryset 를 필터링합니다.
4. 필터링된 queryset에서 단일 객체를 리턴합니다.
뭐 이런 흐름입니다.
중간중간 예외처리나 이런저런 과정들이 있지만 간단하게 말해서 저 위의 내용입니다.
보시면 알겠지만 저희가 장고에서 객체를 가져올때 하는 작업과 큰 차이가 없습니다.
그런데 class 내의 method로 먼저 만들어 놓음으로써,
굳이 저희가 저런 코드를 다시 작성할 필요가 없기 때문에 편리한거죠.
답변이 도움되셨으면 좋겠네요!
그럼에도 의문점이 해결되지 않으셨다면 계속 질문 남겨주시길 바랍니다.
감사합니다-