# PJT 06 : 사용자 인증기반 웹 서비스 구현
## 단계별 구현 과정
### Community App
#### Model
- `movie_title`, `title`, `content`, `rank` 필드를 가진 모델을 생성했습니다.
- `created_at`과 `updated_at` 필드를 추가했습니다.
#### Form
- Django의 ModelForm을 사용해 ReviewForm을 생성했습니다.
- 다음과 같은 위젯을 추가해, 별점은 1~5점만 선택할 수 있게 했습니다.
```python
class ReviewForm(forms.ModelForm):
rank = forms.IntegerField(
widget=forms.NumberInput(
attrs={
'min': 1,
'max': 5,
'type': 'number',
}
)
)
class Meta:
model = Review
fields = '__all__'
```
#### Admin
- Review 모델을 관리자 페이지에 등록했습니다.
#### URL
- 주어진 url 조건대로 설정했습니다.
#### View & Template
- base.html을 확장하여 사용했고,
- UX를 고려해 navbar와 header는 따로 분리하여 작성했습니다.
- 현재 페이지의 위치에 따라 navbar의 요소가 활성화되도록 했습니다.
- User Authentication과 관련된 요소는 navbar 오른쪽에 위치하도록 했습니다.
<br>
- 사용자 인증 여부과 관계 없이 Home화면은 노출됩니다.
- **사용자가 인증되어 있지 않으면**, 로그인 및 회원가입 페이지가 노출되며 해당 페이지로 이동할 수 있습니다.

<br>
- **사용자가 인증되어 있을 경우** 새로운 리뷰를 작성할 수 있는 버튼, 로그아웃 및 정보 변경 페이지 버튼이 노출됩니다.

<br>
- index 페이지 및 detail 페이지에는 평점 (rank)가 별의 개수로 시각화되도록 표현했습니다.

### Accounts App
#### Views
- Login
- AuthenticationForm을 사용했습니다.
- 로그인 되지 않은 사용자가 `@login_required`에 의해 로그인 페이지로 왔을 경우, 로그인 후 next 쿼리문 뒤에 있는 url로 이동시켰습니다.
- Logout
- auth_logout으로 로그아웃 시키고 index 페이지로 이동시켰습니다.
- Signup
- UserCreationForm을 사용했습니다.
- Update
- 회원 정보 수정은 현재 로그인된 사용자 자신만 가능해기 때문에 `@login_required`를 사용했습니다.
- 일반 사용자가 접근할 수 있는 필드를 지정하기 위해 CustomUserChangeForm을 새로 만들어, fields 속성을 만들었습니다.
```python
class CustomUserChangeForm(UserChangeForm):
class Meta:
model = get_user_model()
fields = ('first_name', 'last_name', 'email')
```
- Change Password
- PasswordChangeForm을 사용했습니다.
- 비밀번호 수정은 현재 로그인된 사용자 자신만 가능해기 때문에 `@login_required`를 사용했습니다.
- Delete
- DB에서 사용자 정보를 삭제하고 auth_logout으로 로그아웃시켰습니다.
<br>
#### Templates
- 정보 변경 페이지를 다음과 같이 구성했습니다.

- 비밀번호 변경 페이지를 다음과 같이 구성했습니다.

- 계정 삭제 버튼을 누를 경우 확인 메세지가 나오도록 했습니다.

<br>
## 학습 내용 및 소감
### 채연희 :ice_cream:
- branch, PR 등 git의 기능을 두루 사용해볼 수 있었습니다.
- django CRUD를 빠르게 복습할 수 있어서 좋았습니다.
- 장고 authentication이 잘 와닿지 않았는데, 성재님 덕분에 쉽게 완성했습니다.
- UX를 고려하며 레이아웃과 CSS를 설계해나가는 연습을 했습니다.
- django 전반적인 흐름을 복습할 수 있었지만, 막상 백지 상태에서 작성하려면 어려움이 있을 것 같습니다. 월말평가에 대비한 공부가 필요할 것 같습니다.
- 프로젝트에 많은 것을 시도해봤는데, 성재님께서 잘 따라주시고 좋은 의견을 많이 제시해주셔서 결과물이 만족스럽게 나온 것 같습니다.
### 이성재 :cake:
- git commit 메시지를 상세하게 적는게 힘들었습니다.
- django CRUD가 이제 익숙해진 것 같습니다. 뿌듯합니다.
- CSS를 많이 까먹었는데 연희님 따라서 또 복습하게 되었습니다.
- 연희님이 놓칠 수 있는 부분들까지 세세하게 잡아주셔서 멋있는 결과물이 나왔습니다.