Mixin이란? 왜 필요한지

각각 No object, No form

예를들어 detail view에서 폼을 같이사용하고 싶을때 DetailView만으로는 해결이 안되기 때문에 사용
만든 commentapp을 detail.html에 붙이는 방법

FormMixin:장고에서 제공하는 Mixin

RedirectView를 통한 Subscribeapp 시작
- model

- user가 project를 구독(한 쌍)
- 구독이 한 번만 가능하도록 unique_together 사용
- SubscriptionView

- RedirectView: view작업 후 바로 redirect가 일어나도록하는 view로 subscribe는 구독 버튼만 만들고 다른 로직이 없기 때문에 RedirectView를 상속하여 만든다
- get_redirect_url: redirect url (pk값을 가지고 간다)
- get_object_or_404: GET 방식으로 가져온 project_pk값과 같은 pk를 가진 project가 있으면 가져오고 없으면 404에러
- Subscription.objects.filter(user=user, project=project): 위에서 찾은 user와 project가 같은 subscription을 찾아서 가져온다
- ProjectDetailView
project detail view의 get_context_data에 구독 정보 나타내기
- 현재 user가 로그인되어있으면 subscription에 구독 정보를 가져와서 template으로 넘겨주기 위해서 return에 get_context_data에 넣어준다
Field Lookup을 사용한 구독 페이지 구현

model을 주어진 조건을 나열(AND function)해 찾는다
OR function은?
어떤 user가 구독하는 project를 찾고, 그 project에 있는 article을 찾고 싶음
→ project__in

- SubscriptionListView

- get_queryset(self): 커스텀해서 쿼리셋을 가져오는 조건을 바꿀 수 있다
- user가 구독하는 project 모두를 projects에 가져오기 위해 filter로 현재 request한 user의 구독정보를 values_list로 project를 list형태로 만든다
- user가 구독하는 project에 해당하는 article을 가져오기 위해 Field Lookup 사용(project__in=projects: project중 projects에 있는 것만 가져온다)
WYSIWYG의 소개 및 적용
→ 글쓸 때 사용하므로 form을 커스텀해야한다

content의 textarea를 attrs를 사용해서 class와 style을 따로 지정해서 커스텀한다
project를 선택할 때 required를 false로 해 선택하지 않아도 되도록 커스텀한다

| safe: content를 그대로 보여주지 않고 태그를 제외해준다