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