스태프만 포스트를 작성할 수 있게 만들기
Posted on 2021-08-25 by GKSRUDTN99
Django로 웹사이트 만들기
장고
테스트 코드 작성하기
1. setUp()
에서 obama유저에게만 스태프 권한을 부여한다.
2. trump는 작성 페이지에 접근이 불가능 해야 한다.
3. obama는 작성 페이지에 정상적인 접근이 가능하다.
# blog/tests.py
def setUp(self):
self.client = Client()
self.user_trump = User.objects.create(username='trump')
self.user_trump.set_password('somepassword')
self.user_trump.save()
self.user_obama = User.objects.create(username='obama')
self.user_obama.set_password('somepassword')
self.user_obama.is_staff = True
self.user_obama.save()
self.category_programming = Category.objects.create(name='programming', slug='programming')
self.category_music = Category.objects.create(name='music', slug='music')
self.tag_python_kor = Tag.objects.create(name='파이썬 공부', slug='파이썬 공부')
self.tag_python = Tag.objects.create(name='python', slug='python')
self.tag_hello = Tag.objects.create(name='hello', slug='hello')
self.post_001 = Post.objects.create(
title='첫 번째 포스트입니다.',
content='Hello World. We are the world.',
category=self.category_programming,
author=self.user_trump,
)
self.post_001.tags.add(self.tag_hello)
self.post_002 = Post.objects.create(
title='두 번째 포스트입니다.',
content='1등이 전부는 아니잖아요!',
category=self.category_music,
author=self.user_obama,
)
self.post_003 = Post.objects.create(
title='세 번째 포스트입니다',
content='category가 없을수도 있죠',
author=self.user_obama,
)
self.post_003.tags.add(self.tag_python_kor)
self.post_003.tags.add(self.tag_python)
(... 생략 ...)
def test_create_post(self):
# 로그인 하지 않으면 status code가 200이면 안된다!
response = self.client.get('/blog/create_post/')
self.assertNotEqual(response.status_code, 200)
# staff가 아닌 trump가 로그인을 한다.
self.client.login(username='trump', password='somepassword')
response = self.client.get('/blog/create_post/')
self.assertNotEqual(response.status_code, 200)
# staff인 obama로 로그인한다.
self.client.login(username='obama', password='somepassword')
response = self.client.get('/blog/create_post/')
self.assertEqual(response.status_code, 200)
soup = BeautifulSoup(response.content, 'html.parser')
self.assertEqual('Create Post - Blog', soup.title.text)
main_area = soup.find('div', id='main-area')
self.assertIn('Create New Post', main_area.text)
self.client.post(
'/blog/create_post/',
{
'title': 'Post form 만들기',
'content': "Post Form 페이지를 만듭시다.",
}
)
last_post = Post.objects.last()
self.assertEqual(last_post.title, "Post form 만들기")
self.assertEqual(last_post.author.username, 'obama')
views.py에 UserPassesTestMixin
추가하기
PostCreate에 UserPassesTestMixin
을 추가한다.
test_func()
함수를 추가해 접근 가능한 사용자를 제한한다.
# blog/views.py
from django.shortcuts import render, redirect
from django.views.generic import ListView, DetailView, CreateView
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from .models import Post, Category, Tag
(... 생략 ...)
class PostCreate(LoginRequiredMixin, UserPassesTestMixin, CreateView):
model = Post
fields = ['title', 'hook_text', 'content', 'head_image', 'file_upload', 'category']
def test_func(self):
return self.request.user.is_superuser or self.request.user.is_staff
def form_valid(self, form):
current_user = self.request.user
if current_user.is_authenticated and (current_user.is_staff or current_user.is_superuser):
form.instance.author = current_user
return super(PostCreate, self).form_valid(form)
else:
return redirect('/blog/')
post_list.html
에 New Post 버튼 추가하기
해당 버튼은 관리자 혹은 스태프에게만 보인다.
<!--blog/templates/blog/post_list.html-->
{% extends 'blog/base.html' %}
{% block main_area %}
{% if user.is_authenticated %}
{% if user.is_superuser or user.is_staff %}
<a class="btn btn-info btn-sm float-end" href="/blog/create_post/" role="button"><i class="fas fa-pen"></i> New Post</a>
{% endif %}
{% endif %}
<h1>Blog
{% if category %}<span class="badge bg-secondary float-end">{{ category }}</span>{% endif %}
{% if tag %}<span class="badge bg-warning float-end"><i
class="fas fa-tags"></i>{{ tag }} ({{ tag.post_set.count }})</span>{% endif %}
</h1>
(... 생략 ...)