1
2
3
<div class="text-center>
  텍스트 가운데 정렬하기
</div>
cs


블로그 이미지

쵸잇

,


상황:

2개의 로그인 함수(업체용, 고객용)가 1개의 로그인 템플릿공유하고 있다.

기본 로그인 페이지고객용에 해당하고, 업체용고객용 페이지 하단에 링크를 만들어 링크를 통해 이동한다.

단, 해당 링크고객용에서만 노출되고, 업체용 로그인 페이지에서는 링크가 노출되지 않아야한다.




1-1) 우선 링크를 작성하면 양쪽 로그인 페이지 하단에서 링크가 노출되고 있다.


1-2) 조건문을 작성하여 "참(True)"인 경우에만 링크가 노출되도록 한다. 



1
2
3
4
5
{% if is_client %}
<div class="text-center">
  <a href="/partner/login/">업체용 로그인 페이지</a>
</div>
{% endif %}
cs

 


2) 고객용 로그인 뷰 함수에서 ctx를 통해 "True"값을 전달한다.


1
2
def login(request):
    ctx = { "is_client" : True }
cs



업체용 로그인 뷰에서는 True 값이 전달되지 않으므로 링크가 노출되지 않는다.

블로그 이미지

쵸잇

,

장고 Admin에서 각 user의 소속 그룹지정해줄 수 있다.

그리고 그룹에 따라 접속 가능한 페이지도 나눌 수 있다.



상황:

"partner" 그룹에 속한 유저만 해당 페이지에 접속 허용하고, 그 외 그룹에 속하지 않는 유저메인페이지리다이렉트한다.



1
2
3
4
def menu_add(request):
    ctx = {}
    if "partner" not in request.user.groups.all():
        return redirect("/")
cs


1) 그룹 데이터직접 접근한다.


조건문을 작성하여 해당 페이지에 접속한 유저의 그룹이 필요로하는 "partner" 값인지 유무를 따지고, 없다는 조건이 참이면 메인페이지로 리다이렉트한다.


단, 여기서도 동일한 내용의 코드를 여러 뷰 함수에 담아서 사용하는데에 발생하는 번거로움과 늘어나는 코드량이 문제가 될 수 있다.



2) 1)번과 동일한 기능은 갖춘 user_passes_test 데코레이터 활용하기


1
2
3
4
5
6
7
8
9
from django.contrib.auth.decorators import user_passes_test
 
URL_LOGIN = '/partner/login/'
 
def partner_group_check(user):
    return "partner" in user.groups.all()
 
@user_passes_test(partner_group_check, login_url=LOGIN_URL)
def menu_add(request):
cs


user_passes_test 데코레이터를 사용하기 위해서는 별도의 함수 작성이 필요하다.

함수명은 partner_group_check로서 유저의 그룹이 "partner"인지 확인하는 것으로 만약 거짓이라면 로그인 페이지리다이렉트하게 된다.


*매개변수를 user로 받는데, 이 user는 menu_add 함수의 request.user와 동일하다.


1
2
3
4
5
6
7
8
9
10
11
12
13
URL_LOGIN = '/partner/login/'
 
def partner_group_check(user):
    return "partner" in user.groups.all()
 
@user_passes_test(partner_group_check, login_url=LOGIN_URL)
def menu_add(request):
 
@user_passes_test(partner_group_check, login_url=LOGIN_URL)
def menu_edit(request):
 
@user_passes_test(partner_group_check, login_url=LOGIN_URL)
def menu_delete(request):
cs


partner 그룹에 속한 유저만 사용해야하는 모든 경우에 데코레이터를 손쉽게 가져다 사용할 수 있다.




블로그 이미지

쵸잇

,