Form

Form

ModelForm

form은 정보를 제출하기 위한 대화형 컨트롤을 포함하는 문서 구획을 나타낸다. 그래서 기본적으로는 HTML 문법으로 작성하는데 Django에서는 python 언어로 form 클래스를 사용해서 form을 만들 수 있다. 개인적으로 이 부분이 form을 이해하기 어렵게 만든다고 생각했다. 하지만 form 클래스를 사용하면 따로 관리가 가능하기 때문에 가독성이 더 좋을 것 같다고 생각한다. 그리고 지금 능숙하게 사용하지 못하는 이유는 다양한 클래스의 사용방법을 익히지 못해서니까 공부하자.

Log in, Log out, Sign up은 아래의 코드를 복사 붙여넣기해서 사용해도 별 문제가 없을 정도로

forms.py

from django import forms

from . import models

class LoginForm(forms.Form):

email = forms.EmailField()

password = forms.CharField(widget=forms.PasswordInput)

def clean(self):

email = self.cleaned_data.get("email")

password = self.cleaned_data.get("password")

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"))

class SignUpForm(forms.ModelForm):

class Meta:

model = models.User

fields = (

"first_name",

"last_name",

"email",

)

password = forms.CharField(widget=forms.PasswordInput)

password1 = forms.CharField(widget=forms.PasswordInput, label="Confirm Password")

def clean_password1(self):

password = self.cleaned_data.get("password")

password1 = self.cleaned_data.get("password1")

if password != password1:

raise forms.ValidationError("Password confirmation does not match")

else:

return password

def save(self, *args, **kwargs):

user = super().save(commit=False)

email = self.cleaned_data.get("email")

password = self.cleaned_data.get("password")

user.username = email

user.set_password(password)

user.save()

views.py

from django.views.generic import FormView

from django.urls import reverse_lazy

from django.contrib.auth import authenticate, login, logout

from django.shortcuts import render, redirect, reverse

from . import forms

class LoginView(FormView):

template_name = "users/login.html"

form_class = forms.LoginForm

success_url = reverse_lazy("core:home")

def form_valid(self, form):

email = form.cleaned_data.get("email")

password = form.cleaned_data.get("password")

user = authenticate(self.request, username=email, password=password)

if user is not None:

login(self.request, user)

return super().form_valid(form)

def log_out(request):

logout(request)

return redirect(reverse("core:home"))

class SingUpView(FormView):

template_name = "users/signup.html"

form_class = forms.SignUpForm

success_url = reverse_lazy("core:home")

def form_valid(self, form):

form.save()

email = form.cleaned_data.get("email")

password = form.cleaned_data.get("password")

user = authenticate(self.request, username=email, password=password)

if user is not None:

login(self.request, user)

return super().form_valid(form)

from http://h-j-j.tistory.com/124 by ccl(A) rewrite - 2021-10-27 18:59:45