on
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