본문 바로가기

카테고리 없음

http <form action> url 지정 / django @login_required

<form> 태그의 action 속성은 form data를 서버로 request 요청을 보낼 때 해당 데이터가 도착할 URL을 명시하기 때문에 보통은 url을 지정해야한다.

# create.http
# path('create/', views.create, name='create')

# app_name : 'articles'에 있는 url_name : 'create'로 form data 전송
<form action="{% url 'articles:create' %}" method="POST">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">저장</button>
</form>

이렇게 보낼 데이터를 받을 url이 필요하다.

 

 

그런데 http 분리없이 한 url에서 get과 post의 요청이 전부 처리 된다면

<form>에서 url 지정이 굳이 필요없다.

url을 비워놓으면 해당  url로 request를 보내기 때문!

# 이렇게 url을 비워놓으면 현재 경로인 create/ 로 request 요청이 보내짐
<form action="" method="POST">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">저장</button>
</form>

 

 

그래서 이런 것도 된다!

# login.html
<h1>로그인</h1>

<form action="" method="POST">
    {% csrf_token %}
    {{ form.as_p}}
    <input type="submit" value="로그인">
</form>
@require_http_methods(["GET", "POST"])
def login(request):
    if request.method == 'POST':
        form = AuthenticationForm(data=request.POST)
        if form.is_valid():
            auth_login(request, form.get_user())
            next_url = request.GET.get("next") or "articles:index"
            return redirect(next_url)

 

 

django의 @login_required 데코레이션을 함수형 view에 사용하면 해당 view로 넘어갈 때 로그인이 되어 있지 않다면
accounts/login 경로로 이동시키고 로그인 성공 후 이동할 url이 자동으로 전달된다.

이렇게 next라는 url query 변수에 이동할 url을 넣는다.

 

 

그래서 <form action="" method="POST"> 이렇게 form action을 비워놓으면

next_url = request.GET.get("next") or "articles:index"
return redirect(next_url)

 

이런식으로 next_url로 redirect 시킬 수 있다.

 

 

form action을 비워놓아야 하는 이유는

url을 지정해주면 request 요청을 받는 url이 항상 지정한 url로 고정되기 때문이다.