Profileapp
decorators.py 생성 
from django.http import HttpResponseForbidden
from profileapp.models import Profile
def profile_ownership_required(func):
    def decorated(request, *args, **kwargs):
        profile = Profile.objects.get(pk=kwargs['pk'])
        #urls.py에서 update/로 받은 pk에서 profile의 주인을 받아와서 확인
        if not profile.user == request.user:
            return HttpResponseForbidden()
        #request한 user와 다르면 접근 금지
        return func(request, *args, **kwargs)
    return decorated
Python
복사
get_success_url 함수 그리고 리팩토링
profile의 edit가 누구에게나 보이지 않게 만듬
MagicGrid 소개 및 Articleapp 시작
MagicGrid란
임의의 높이를 가진 카드형 레이아웃
Articleapp 구현
Articleapp의 CRUD 기능을 전부 구현
models.py에 class 생성
from django.contrib.auth.models import User
from django.db import models
# Create your models here.
class Article(models.Model):
    writer = models.ForeignKey(User, 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_created=True, null=True)
Python
복사
forms.py에 
from django.forms import ModelForm
from articleapp.models import Article
class ArticleCreationForm(ModelForm):
    class Meta:
        model = Article
        fields = ['title', 'image', 'content']
Python
복사
ListView, Pagination 소개 및 적용
NoReverseMatch 에러
게시글을 업데이트 하려고 했더니 detail 페이지로 안 넘어가는 에러 발생
urlpatterns = [
    path('list/', ArticleListView.as_view(), name='list'),
    path('create/', ArticleCreateView.as_view(), name='create'),
    path('detail/<int:pk>', ArticleDetailView.as_view(), name='detail'),
Python
복사
detail의 path에서 <int:pk>가 빠져있어서 냉큼 수정했더니 문제 해결
근데 이제 detail 페이지에서 update 버튼 누르면 똑같은 에러 발생
이번엔 urls.py도 정상 쟤가 말하는대로 update.html을 확인하니
<div style="text-align: center; max-width: 500px; margin: 4rem auto">
  <div class="mb-4">
    <h4>Article Update</h4>
  </div>
  <form action="{% url 'articleapp:update' pk=target_article.pk %}" method="post">
HTML
복사
form 태그의 pk=target_user.pk로 되어있었음..그래서 article.pk로 수정해주니 문제 해결
Mixin 소개 및 Commentapp 구현
Comment가 별도의 페이지로 존재하는게 아니라 Article 밑에 있도록 레이아웃을 바꿔줘야함
class ArticleDetailView(DetailView, FormMixin):
    model = Article
    form_class = CommentCreationForm
    context_object_name = 'target_article'
    template_name = 'articleapp/detail.html'
Python
복사
ArticleDetailView에서 FormMixin을 상속받아 form_class를 CommentCreationForm으로 추가
아직 comment를 입력해도 comment가 안 보임! → detail.html에서 시각화
<div style="border: 1px solid; text-align: left; padding: 4%; margin: 1rem 0;
            border-radius: 1rem; border-color: #bbb;">
    <div>
        <strong>
            {{ comment.writer.profile.nickname }}
        </strong>
           
        {{ comment.created_at }}
    </div>
    <div style="margin: 1rem 0;">
        {{ comment.content }}
    </div>
    {% if comment.writer == user %}
    <div style="text-align: right">
        <a href="{% url 'commentapp:delete' pk=comment.pk %}"
           class="btn btn-danger rounded-pill">
            Delete
        </a>
    </div>
    {% endif %}
</div>
HTML
복사
모바일 디버깅, 반응형 레이아웃
ProjectApp 구현
ProjectApp
1.
create/ Detail/ List View
2.
Success_url to related Project
3.
Login_required to CreateView
4.
Model
a.
title
b.
description
c.
image
d.
created_at


