django views를 건조하게 유지합니다
-
11-09-2019 - |
문제
현재 로그인 한 사용자를 얻는 코드가 있습니다.
userID = request.session.get("_auth_user_id")
if userID:
loggedin_user = User.objects.get(pk=int(userID))
else:
loggedin_user = None
사용자 이름이 모든 페이지에 표시되기를 원합니다.
현재 나는 모든보기에 코드를 넣고 모든 템플릿에 사용자 개체를 전달하고 있습니다.
return render_to_response('index.html', {loggedin_user})
이것은 Django의 건조한 윤리에 위배되는 것 같습니다. 나 자신을 반복하면서 어떻게 할 수 있습니까?
편집 : 아마도 사용자는 나쁜 예일 것입니다.
데이터베이스에서 객체 목록을 가져오고 싶다면 어떻게해야합니까?
items = Item.objects.all()
그리고 모든 페이지에 나열하십시오.
해당 코드를 작성하고 모든보기에서 목록을 템플릿으로 전달해야합니까? 아니면 모든 템플릿에서 해당 목록을 사용할 수 있도록 코드를 작성할 수 있습니까?
해결책
당신은 a를 사용해야합니다 사용자 정의 템플릿 태그 그런 것. 사용자 정의 태그에서 필요한 데이터를 가져와 템플릿으로 보낼 수 있습니다. 당신이 기억해야 할 것은 당신이 그것을 사용할 템플릿 파일에 태그를로드하는 것입니다.
다른 팁
사용자 ID는 이미 세션 내에 존재합니다. 따라서 계속 전달할 필요는 없습니다.
{{ request.session._auth_user_id }}
작동하지만 설정 파일에서 Template_Context_Processors에 추가해야합니다.
django.core.context_processors.request
Render_To_Response에서는 요청을 매개 변수로 추가해야합니다. 예를 들어:
return render_to_response('test.html',{}, context_instance=RequestContext(request))
request.user는 어떻습니까?
if request.user.is_authenticated():
name = request.user.username
else:
name = "Anonymous"
어쨌든, Django에서 아직 사용할 수 없다면 django.contrib.sessions.middleware.sessionmiddleware 또는 django.contrib.auth.middleware.authenticationmiddleware와 같은 미들웨어 클래스를 작성하는 것이 좋습니다. 해당 클래스는 요청 세부 사항이보기로 보내지기 전에 변경됩니다.
뷰마다 필요하다면, 작은 일을하기 위해 데코레이터를 작성하고 원하는보기를 @decorator 할 수 있습니다.