Project 안에 Article 이 생성되는 형식으로
project 안에 article 이 생성되는 형식으로 되어야하기 떄문에 이를 수정해줄것.
기존의 articleapp 의 models.py 에는 누가 작성했는지에 대한 writer 정보만이 있었는데, 이에 추가적으로 어느 프로젝트(게시판)에 해당하는지 정보 추가
from django.contrib.auth.models import User
from django.db import models
from projectapp.models import Project
class Article(models.Model):
writer = models.ForeignKey(User, on_delete=models.SET_NULL, related_name='article', null=True)
# project 추가
project = models.ForeignKey(Project, on_delete=models.SET_NULL, related_name='article', null=True)
title = models.CharField(max_length=200, null=True)
image = models.ImageField(upload_to='article/', null=False)
content = models.TextField(null=True)
created_at = models.DateTimeField(auto_now_add=True, null=True)
모델을 수정하였으므로 다음으로는 form 내부에서 이 게시글을 작성했을때 어느 게시판에 해당하는 글을 쓸지를 정해줘야하기 떄문에 다음 수정
from django.forms import ModelForm
from articleapp.models import Article
class ArticleCreationForm(ModelForm):
class Meta:
model = Article
fields = ['title', 'image', 'project', 'content']
# project 추가
모델을 바꿨기 떄문에 migration 작업을 진행
create article 을 클릭한 결과 우리가 게시글을 작성하려 할떄 원하는 project 를 선택할 수 있게 된다.
4번쨰 풍경 project 에 새로운 article 작성
Project nav 에서 하단에 article 을 pinterest 레이아웃으로 보이게 하기
그런데 막상 풍경 게시판을 가면 게시글을이 보이지 않기 때문에, 밑 부분쪽에 pinterest 레이아웃으로 게시글이 보이도록 수정
이렇게 하기 위해서 먼저 이전에는 for 문으로 target_article 을 모두 불러왔었다.
하지만 이것의 문제점은, 요소 전부를 가져오는 것이고 또한 여러가지 조건문을 추가하여 이와같이 템플릿 안에서 복잡도를 올리는것은 썩 좋은 방법이 아니다.
그래서 뷰안에서 Mixin 을 하나 더 사용해서 구현
projectapp 의 detailview 부분 수정
아래의 detailview 에서는 object 하나만을 가지고 있는데, 여기서 추가적으로 여러가지 object 를 다룰 수 있게 만들어주는 MultipleObjectMixin 을 추가로 상속 받아준다.
class ProjectDetailView(DetailView, MultipleObjectMixin):
model = Project
context_object_name = 'target_project'
template_name = 'projectapp/detail.html'
paginate_by = 25 # 추가
def get_context_data(self, **kwargs):
object_list = Article.objects.filter(project=self.get_object())
return super(ProjectDetailView, self).get_context_data(object_list=object_list, **kwargs)
# 템플릿 창에서 object_list 라는 것을 사용해서 필터링 한 게시글들을 사용할 수 있게 함.
detail.html
{% extends 'base.html' %}
{% block content %}
{% endblock %}
위와 같이 작성한 부분은 어떤 project 인지에 대한 정보가 나오는 부분이고 그 밑에다가 pinterest layout 을 집어 넣을 것.
기존에 articleapp 의 list.html 에서 이와 비슷한 작업들을 하였기 때문에, /articleapp/list.html 을 복사하여 app 에 종속되어 있지 않은 templates 의 snippets 안에 list_fragment.html 을 만들고 복사한 내용을 붙여넣는다.
이 html 파일을 base 로 사용할 것이 아니라 코드 조각으로 사용할 것이기 때문에 extends, block 구문 다 지워주기.
{% extends 'base.html' %}
{% block content %}
{% endblock %}
이를 다 복사하고 우리가 필요한 것은 article_list, 즉 article_list 만 사용하면 된다, 즉, /projectapp/templates/projectapp/detail.html
의 밑부분에 include 구문을 사용
snippets 안에 list_fragment.html 을 가져오는데, article_list 를 view 단에서 넘겨줬었던 object_list 와 연결을 시켜주어 가져와준다.
{% extends 'base.html' %}
{% block content %}
{% endblock %}
실행결과 이전에 새로 생성했던 게시글이 '풍경' project 에 제대로 들어가있는것을 볼 수 있다.
My Page nav 하단에 각 계정이 작성한 글들이 보이도록
accountapp/views.py 의 detailview 수정
위와 동일한 방식으로 detailview 수정
class AccountDetailView(DetailView, MultipleObjectMixin):
model = User
context_object_name = 'target_user'
template_name = 'accountapp/detail.html'
paginate_by = 25
def get_context_data(self, **kwargs):
object_list = Article.objects.filter(writer=self.get_object())
return super(AccountDetailView, self).get_context_data(object_list=object_list, **kwargs)
accountapp/detail.html
{% extends 'base.html'%}
{% block content %}
{% endblock %}
테스트 결과 내가 작성했던 모든 글들이 My page 하단에 표시가 됨을 확인할 수 있다.