[Django] dashboard
User management (4)
/ raise / login_required / dashboard
Dashboard
from django.contrib.auth.decorators import login_required
@login_required(login_url='my-login')
def dashboard(request):
return render(request, 'account/dashboard.html')
- 로그인을 했을 경우 dashboard로 안했을 경우 my-login 페이지로 이동
- login_required 를 구현하는 방법은 3가지가 있다.
1) request.user로 판단
def index(request: HttpRequest) -> HttpResponse:
if not request.user.is_authenticated:
return redirect("/accounts/login/")
qs = Post.objects.all()
return render(request, "blog/index.html", context={"post_list": qs})
index함수는 view의 함수로 request를 input으로 받습니다. user가 로그인된 경우, request.user.is_authenticated는 True를 반환합니다. 이를 이용해서 조건문으로 로그인되지 않은 경우 login 화면으로 리다이렉트 하는 코드
2) @login_required로 판단
데코레이터 문법을 활용한 방법 데코레이터를 활용한 방법을 AOP(Aspect Oriented Programming:관점 지향 프로그래밍) AOP는 쉽게말해, 보기 좋게 프로그래밍하는 것 데코레이터로 함수/클래스를 감싸는 형태로 필요한 기능을 수행하기 때문
@login_required
def post_detail(request: HttpRequest, pk: int) -> HttpResponse:
# post = Post.objects.get(pk=pk)
post = get_object_or_404(Post, pk=pk)
# 해당 오브젝트가 없으면 404페이지로 보낸다.
return render(request, "blog/post_detail.html", {"post": post})
데코레이터를 이용한 방법 View에서 사용하고자 하는 함수위에 @login_required를 작성해주면 그 바로 아래의 함수에 대해 wrapper(래퍼) 역할을 하여 로그인된 경우만 아래 함수가 실행될 수 있도록 하고, 로그인하지 않은 상태로 아래 함수를 호출하게 되면 해당 유저는 로그인 화면으로 가게 된다. (클래스형 뷰에는 이를 쓸 수 없다.)
3) login_required() 함수 사용
post_new = login_required(
CreateView.as_view(
model=Post,
form_class=PostForm,
success_url="/blog/",
)
)
CreateView.as_view()라는 CBV(Class Based View)를 사용하는 경우는 함수/클래스를 정의하는 게 아니고, 정의된 클래스를 import 하여 사용하기 때문에 데코레이터를 사용하기 어렵다. 그럴 땐, login_required() 함수 내부에 CreateView.as_view() 함수를 작성하면, 해당 뷰 함수는 로그인된 경우만 호출
- 참고 : https://bio-info.tistory.com/172
Profile
Update foam 만들기 account > foams.py
# Update form
class UpdateUserForm(forms.ModelForm):
password = None
class Meta:
model = User
fields = ['username', 'email']
exclude = ['password1','password2']
def __init__(self, *args, **kwargs):
super(UpdateUserForm, self).__init__(*args, **kwargs)
# Maek email field as required
self.fields['email'].required= True
# Email validation
def clean_email(self):
email = self.cleaned_data.get('email')
if User.objects.filter(email=email).exclude(pk=self.instance.pk).exists():
raise forms.ValidationError('This email is invalid')
# Len function updated
if len(email) >= 350:
raise forms.ValidationError('Your email is too long')
return email
- raise 조건문에 안 맞으면 에러 발생
- 비밀번호는 Forgotten your password로 대체한다.
- 이메일은 주민번호처럼 고유값이므로 유효성 검사를 통해 중복이 되지 않도록 만들어준다.
뷰 연결하기 account > views.py
@login_required(login_url='my-login')
def profile_management(request):
# Updating our user's username and email
user_form = UpdateUserForm(instance=request.user)
if request.method == 'POST':
user_form = UpdateUserForm(request.POST, instance=request.user)
if user_form.is_valid():
user_form.save()
messages.info(request, "Account updated")
return redirect('dashboard')
context = {'user_form':user_form}
return render(request, 'account/profile-management.html', context=context)
- 업데이트 했을때 이메일로 유효성 검사가 완료된 경우에 변경된 내용을 저장해주고 대쉬보드로 리다이렉 해준다.
Delete
뷰 연결하기 views.py
@login_required(login_url='my-login')
def delete_account(request):
user = User.objects.get(id=request.user.id)
if request.method == 'POST':
user.delete()
messages.error(request, "Your account deleted")
return redirect('store')
return render(request, 'account/delete-account.html')
댓글남기기