ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • django login FBV using forms.py
    Project using python/Cloning Airbnb 2021. 3. 2. 11:36

    Forms.py

    users/forms.py

      forms.py에 있는 LoginForm이다. forms.ModelForm을 상속받는다. 여기서 필수적으로 있어야 하는 code는 class Meta에 있는 model과 fields다. Meta class는 부모 class의 meta 정보를 담고 있다. meta 정보란 하나의 data의 추가적인 정보를 뜻한다. 사진을 예로 든다면, 사진은 색깔과 화소 등의 정보를 가지고 있다. 그리고 사진의 meta 정보란 찍은 장소, 시간 및 keyword나 작가 정보를 가진다. 사진의 필수 정보는 색깔과 화소이고 없어도 되지만 있으면 더 좋은 것을 장소, 시간, keyword와 작가 정보다.

      Django에서 Meta class는 admin.py를 작성할 때도 많이 볼 수 있다. forms.ModelForm에서 Meta class는 없어도 되는 것이 아니라 반드시 있어야 한다. 그 중 model과 fields는 반드시 정의해야 form을 작성할 수 있다. model을 정해주고 model에 정의된 field 값을 할당하면 할당된 field를 client 측에 전송할 수 있다.

      widgets은 만들어진 field에 속성을 추가하는 등의 추가적인 작업을 할 수 있다.

      clean__data는 유효성 검사를 위해서 사용한다. clean__<field_name>으로 function을 만들고 logic은 유효성 검사를 한 후 valid하면 값을 return하는 방식이고 타당하지 않다면 error를 발생시킨다. 단순히 raise forms.ValidationError()를 하면 generic하게 error가 상단에 display된다. self.add_error()를 사용하면 error가 발생한 field 근처에서 error message가 표시된다.

    class LoginForm(forms.ModelForm):
        """ Login Form """
    
        class Meta:
            model = models.User
            fields = {"email", "password"}
            widgets = {
                "email": forms.EmailInput(attrs={"placeholder": "Email"}),
                "password": forms.PasswordInput(attrs={"placeholder": "Password"}),
            }
    
        def clean__email(self):
            email = self.cleaned_data.get("email")
            try:
                models.User.objects.get(email=email)
                return email
            except models.User.DoesNotExist:
                self.add_error("email", forms.ValidationError("User does not exist"))
    
        def clean(self):
            password = self.cleaned_data.get("password")
            email = self.cleaned_data.get("email")
            try:
                user = models.User.objects.get(email=email)
                if user.check_password(password):
                    return self.cleaned_data
                else:
                    self.add_error("password", forms.ValidationError("Password is wrong"))
            except models.User.DoesNotExist:
                self.add_error("email", forms.ValidationError("User does not exist"))
            return super().clean()

    FBV(Function Based View)

    users/views.py

    from django.shortcuts import render, redirect, reverse
    from django.contrib.auth import authenticate, login
    from . import forms
    
    def loginView(request):
        if request.method == "GET":
            form = forms.LoginForm
        elif request.method == "POST":
            form = forms.LoginForm(request.POST)
            if form.is_valid():
                email = request.POST.get("email")
                password = request.POST.get("password")
                user = authenticate(request, username=email, password=password)
                if user is None:
                    return redirect(reverse("users:login"))
                login(request, user)
                return redirect(reverse("core:home"))
        return render(request, "pages/users/login.html", {"form": form})
    

    templates

    pages/users/signup.html

      self.add_erros()의 error message는 form.<field_name>.errors로 표현한다.

    {% extends 'base.html' %}
    
    {% block page_title %}
      Login
    {% endblock page_title %}
    
    {% block search-bar %}
    <div></div>
    {% endblock search-bar %}
    
    {% block content %}
      <div class="background">
        <div class="wrap">
          <form action="{% url 'users:login' %}" method="post" class="form">
            {% csrf_token %}
            <div class="form_input rounded-tl-lg rounded-tr-lg">
              {{form.email.errors}}
              {{form.email}}
            </div>
            <div class="form_input rounded-bl-lg rounded-br-lg">
              {{form.password.errors}}
              {{form.password}}
            </div>
            <button class="form_button">Submit</button>
          </form>
        </div>
      </div>
    {% endblock content %}

      존재하지 않는 ID로 로그인을 해서 Error message가 email 바로 위에 display 됬다.

    참고 자료

    소스 코드

    github.com/zpskek/airbnb-clone-v3/commit/dfd1c591bd16e82e6fca2d6a3e922c7fe30e05dc

    'Project using python > Cloning Airbnb' 카테고리의 다른 글

    django logout  (0) 2021.03.02
    django Login CBV  (0) 2021.03.02
    django login FBV  (0) 2021.03.02
    django signup CBV  (0) 2021.03.01
    django signup FBV using forms.py  (0) 2021.03.01

    댓글

Designed by Tistory.