21강
django container
Accountapp
•
view 상속 : django.views.generic 
•
reverse : def
•
reverse_lazy : class
22강
•
Login/Logout View
◦
Login
▪
path('login/', LoginView.as_view(template_name='accountapp/login.html'), name='login'),
◦
Logout
▪
path('logout/', LogoutView, name='logout'),
•
Redirect Mechanism
◦
next → LOGIN_REDIRECT_URL → Default
◦
settings.py
LOGIN_REDIRECT_URL = reverse_lazy('accountapp:hello_world')
LOGOUT_REDIRECT_URL = reverse_lazy('accountapp:login')
Python
복사
23강
•
bootstrap 스타일링 정리
settings.py/INSTALLED 입력
◦
bootstrap 설치 → {{ form }} 대신  {% bootstrap_form form %}사용
class="btn btn-dark rounded-pill col-6 mt-3
Python
복사
col : parent 너비의 비율 (12=100%), mt(margin top)
•
글꼴 
◦
static 파일에 fonts , fonts 에 사용할 폰트(.otf) 넣기
◦
head.html
<style>
    @font-face {
        font-family: 'NanumSquareR';
        src: local('NanumSquareR'),
        url("{% static 'fonts/NanumSquareR.otf' %}") format("opentype");
        }
     @font-face {
        font-family: 'NanumSquareEB';
        src: local('NanumSquareEB'),
        url("{% static 'fonts/NanumSquareEB.otf' %}") format("opentype");
        }
     @font-face {
        font-family: 'NanumSquareB';
        src: local('NanumSquareB'),
        url("{% static 'fonts/NanumSquareB.otf' %}") format("opentype");
        }
     @font-face {
        font-family: 'NanumSquareL';
        src: local('NanumSquareL'),
        url("{% static 'fonts/NanumSquareL.otf' %}") format("opentype");
        }
</style>
HTML
복사
24강
•
Detail View (Read View)
◦
Detail 을 보기 위해서는 primary key 필요
class AccountDetailView(DetailView):
    model = User
    context_object_name = 'target_user'
    template_name = 'accountapp/detail.html'
Python
복사
<div>
    <div style="text-align:center; max-width:500px; margin: 4rem auto">
      <p>
        {{ target_user.date_joined }}
      </p>
      <h2 style="font-family: 'NanumSquareB';">
        {{ target_user.username }}
      </h2>
    </div>
  </div>
HTML
복사
25강
•
Update View (Change info) 
◦
Create View와 유사
•
ID 수정 비활성화
◦
accountapp → forms.py
from django.contrib.auth.forms import UserCreationForm
class AccountUpdateForm(UserCreationForm):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['username'].disabled = True
Python
복사
26강
•
Delete View
◦
views.py
class AccountDeleteView(DeleteView):
    model = User
    success_url = reverse_lazy('accountapp:login')
    template_name = 'accountapp/delete.html'
Python
복사
27강
•
Authentication
28강
•
Decorator
◦
함수를 꾸며주는 역할
login 여부: login_required
 lognin user 와 현재 페이지 접근 user 일치 
def account_ownership_required(func):
    def decorated(request, *args, **kwargs):
        user = User.objects.get(pk=kwargs['pk'])
        if not user == request.user:
            return HttpResponseForbidden()
        return func(request, *args, **kwargs)
    return decorated
Plain Text
복사
@login_required
Python
복사
decorator 사용시 @
has_ownership = [account_ownership_required, login_required]
Python
복사
리스트 가능
29강
•
Super User 생성
◦
admin
•
media 관련
30강
•
profile
◦
Account : Profile
◦
Profile 
▪
Image, Nickname, Message
▪
Delete, Detail View
▪
user = models.OneToOneField(User, on_delete=models.CASCADE)
CASCADE : user 가 삭제될 때 profile도 같이 사라짐
•
Form
◦
Model Form 
▪
profile form X → Model Form을 활용하여 적절한 Form 생성
from django.forms import ModelForm
from profileapp.models import Profile
class ProfileCreationForm(ModelForm):
    class Meta:
        model = Profile
        fields = ['image', 'nickname', 'message']
Python
복사
