내일배움캠프 26일차

2023년 04월 20일 by barryjung

    내일배움캠프 26일차 목차

[오늘한일]

  • 알고리즘 문제풀이
  • 장고 심화강의 수강
  • 기초프로젝트 복기

 

[오늘 배운점]

하루에 시간을 조금 할당해, 기초 프로젝트 복습을 하고있다.

 

<장고 기본 유저모델 사용시 설정>

복습해보자면, 기본 유저모델은 User와 AbstractUser가 있다.

AbstractUser를 이용해서 커스텀 유저모델을 만들었다고 한다면, (이름을 UserModel이라 지었다)

기본 Auth.User의 대상 모델명이 변경되었다는 설정을 해줘야 한다.

 

AUTH_USER_MODEL = 'user.UserModel'

settings.py에 이렇게 작성해줘야 한다. (따로 import는 필요없다.)

 

위 문구를 작성하지 않은 상태에다가, 커스텀 모델의 이름이 UserModel이여서 예기치 않은 오류가 났다.

작성을 빠뜨린다면 위와같은 에러를 만날수도 있다.

 


<URL이름을 사용할때>

    path('signup/', views.signup_view, name="signup"),
    path('login/', LoginView.as_view(template_name="user/login.html"), name="login"),
    path('logout/', LogoutView.as_view(), name="logout"),
    path('edit/', views.edit_profile_view, name="edit_profile"),

user앱의 urls.py가 이렇게 있다고 하자.

 

<div class="navbar-nav">
    {% if user.is_authenticated %}
    <a class="nav-link" href="{% url 'mypage' %}">{{ user.username }} 마이페이지</a>
    <a class="nav-link" href="{% url 'logout' %}">로그아웃</a>
    {% else %}
    <a class="nav-link" href="{% url 'login' %}">로그인</a>
    <a class="nav-link" href="{% url 'signup' %}">회원가입</a>
    {% endif %}
</div>

그리고 템플릿에 내비게이션 바의 코드이다.

 

각각, 로그인, 로그아웃, 회원가입, 마이페이지 등 내비게이션 버튼에,

해당 페이지로 이동하도록 하이퍼링크에 url을 적었다.

 

이때 그냥 "/user/login/" 이렇게 적어도 되지만,

연결성을 고려해서 저렇게 url 이름을 참조하도록 적는 방법을 사용한다.

 

장고는 동작시 기본적으로 프로젝트 폴더내의 urls.py만 불러들인다.

기본 urls.py에 다 작성한다면 상관없지만

앱별로 urls.py를 따로 둔다면 include로 기본 urls에 연결해야한다.

이렇게 연결하면 아래 앱의 url의 이름도 위처럼 문제없이 사용할수 있다.

 

 

그런데 만약 앱이 늘어나는 등 확장성을 고려한다면,

{% url 'user.login' %} 의 작성법으로 어떤 앱의 어떤 url이름인지 작성하는게 좋다.

이런 경우 각 앱의 urls.py에,

app_name = '앱이름'을 작성해야 한다.

 

app_name은 주지 않고 {% url '앱.url명' %}으로 작성한다면,

아래의 에러가 나온다.

user는 등록된 이름칸이 아니라는 에러. app_name을 적지 않았음을 인지할수 있다.

 


<폼 전송할때는 csrf토큰 붙이기>

장고에서는 form태그 아래에다가 {% csrf_token %}을 붙여야한다.

 

작성하지 않은 경우,

django.template.exceptions.TemplateSyntaxError: Invalid block tag on line 2: 'csrf_tokken'.

Did you forget to register or load this tag?
터미널에 이런 에러가 나온다.

 

작성을 빠트리지 말고 오타에 유의하자.

 


<장고 기본로그인 view에는 폼이 포함되있다.>

 

from django.contrib.auth.views import LoginView, LogoutView

urlpatterns = [
    path('login/', LoginView.as_view(template_name="user/login.html"), name="login"),
    path('logout/', LogoutView.as_view(), name="logout"),
]

기본 로그인/로그아웃 기능도 복습해보았다.

지난주 배운점에 auth views에 LoginView와 LogoutView를 적었었다.

 

장고에서 기본으로 제공하는 view함수로,

이걸 이용하면 view를 따로 작성할 필요가 없다.

 

먼저, as로 이름을 변경해오던 부분은 위처럼 작성해서 없앨수 있었다.

어느 지점까지를 from에 적고, 어느 지점을 import하느냐에 따른 차이였다.

이 부분도 상황에 따라 적합하게 적을수 있어야 겠다.

 

로그인의 경우, 저렇게 템플릿을 보내줘야 하는데

작성해주지 않는다면 /registration/login.html을 찾는다.

 

/registation/login.html를 찾으며 템플릿이 존재하지 않는다는 에러. 우측에는 LoginView에서의 설정이다.

LoginView모듈을 열어보면,

template_name이 위처럼 지정되어 있다.

해당 위치에 템플릿을 위치시키거나, 위치를 수정시키거나 해야한다.

 

 

모듈파일을 열어보면서 흥미로운걸 알수있었다.

LoginView에 기본 로그인 폼인 AuthenticationForm이 부여되어있다.

복기하면서 한번 시도해보았다.

 

만든 login.html 템플릿에 {{form}}을 작성해봤다.

<form method="post">
    {% csrf_token %}
    {{form}}
    <button type="submit" class="btn btn-primary">로그인</button>
</form>

폼이 잘 동작한다. AuthenticationForm의 모습이다.

 

즉, 기본 view를 이용하면 views.py의 작성도 필요없고

forms.py에 작성이 없어도 폼을 쓸수 있다.

(심지어 AuthenticationForm을 어디서도 import하지 않아도 된다.)

 


<장고 기본 유저수정 폼의 모습>

기본 유저기능의 폼중에 UserChangeForm이라는 폼을 복습해봤다.

(UserCreationForm과 AuthenticationForm의 친구다.)

지난 팀프로젝트에서 이걸 사용했었는데 한번 더 컴팩트하게 작성해보았다.

 

별도 수정없이, UserChangeForm을 그대로 전송해본 모습. UserChangeForm의 낯면이다.

 

내용도 많고 중요한 부분도 다수 있어 보인다.

비밀번호 암호화 덕분에 이 페이지, 즉 기본 user 수정에서는 비밀번호를 못바꾼다는 내용이 있다.

 

아무래도 좀 거창해서, 폼을 수정해봤다.

 

class EditProfileForm(UserChangeForm):
    class Meta:
        model = UserModel
        fields = ['bio']

user앱 forms.py에 상속해서 이렇게 작성했다.

 

간결해졌지만 아직 비밀번호 부분이 남아있다. 오른쪽은 UserChangeForm 모듈파일이다.

 

모듈파일을 열어보니 패스워드에 대한 안내 기본적으로 동작되고 있다.

나는 해당 부분을 생략하게 해줘야겠다고 생각했다.

인터넷으로 알아보니 방법을 찾을수 있었다.

class EditProfileForm(UserChangeForm):
    password = None

    class Meta:
        model = UserModel
        fields = ['bio', 'image']

이렇게 password = None을 부여해줬다.

 

원하던 수정화면의 모습이다!

 

결론, 기본 수정폼의 낯면을 확인해봤다.

약간의 가공이 있어야 했지만, 기본 수정폼을 이용해봤다.

 


복기하면서 만들고 있는 프로젝트 모습이다.

마지막으로, 그냥 피드페이지를 캡처해봤다.

 

복기하며 또 다뤄보니, 부트스트랩을 쓰는 것도 한단계 레벨업되었다.

프론트 결과물을 보면 약간의 리프레쉬가 되서 좋다.