작정하고 Django 41강 - MultipleObjectMixin을 통한 Projectapp 마무리

_·2024년 1월 7일

작정하고 Django 강의

목록 보기
40/44

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

Create your models here.

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 을 추가로 상속 받아준다.

projectapp/views.py

MultipleObjectMixin 추가

class ProjectDetailView(DetailView, MultipleObjectMixin):
model = Project
context_object_name = 'target_project'
template_name = 'projectapp/detail.html'

paginate_by = 25 # 추가

실질적으로 어떤 게시글을 가져올지에 대한 필터링 구문 -> 메소드 추가 정의

현재 프로젝트와 같은 프로젝트를 가진 article 을 object_list 안에다가 필터링 하는 코드

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 %}

{{ target_project.title }}

{{ target_project.description}}

{% 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 %}

...
{% include 'snippets/list_fragment.html' with article_list=object_list %}

{% 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 %}

...
{% include 'snippets/list_fragment.html' with article_list=object_list %}

{% endblock %}
테스트 결과 내가 작성했던 모든 글들이 My page 하단에 표시가 됨을 확인할 수 있다.

commit

0개의 댓글