티스토리 뷰
[django 블로그] Post 게시물 작성 (views.py, @login_required, templates, post_write.html, media_root)
지휘리릭 2020. 2. 2. 14:07● 게시물 작성
post/views.py
- 쇼핑몰 프로젝트에서는 직접 login_required를 만들어서 @mehod_decorator(login_required, name = 'dispatch')으로 접근 권한을 관리했다면, 이번에는 'django.contrib.auth.decorators' 장고 내장 모듈을 사용하여 @login_required으로 원하는 함수를 감싸서 해당 로직에 대한 접근을 관리한다.
- POST 요청일 경우( 글을 작성하고 "저장하기" 버튼을 누른 경우), 사용자가 작성한 정보 title, content, image 에 대한 값을 가져오고 Post 객체 생성한다.
- 게시물 객체를 생성하고, reverse 함수를 사용하여 현재 생성한 게시물의 상세페이지 주소를 만들고 redirect 를 사용하여 해당 주소로 이동한다.
- GET 요청인 경우( 버튼을 누르기 전), 그냥 post_wirte.html 을 렌더링하여 화면에 띄워준다.
@login_required
def post_write(request):
errors = []
if request.method == 'POST':
title = request.POST.get('title', '').strip()
content = request.POST.get('content', '').strip()
image = request.FILES.get('image')
if not title:
errors.append('제목을 입력하세요.')
if not content:
errors.append('내용을 입력하세요.')
if not errors:
post = Post.objects.create(user=request.user, title = title, content = content, image = image)
return redirect(reverse('post_detail', kwargs={'post_id': post.id}))
return render(request, 'post_write.html', {'user':request.user, 'errors':errors})
templates/post_write.html
- 이전에 글 작성에 대해서 오류가 있었다면, 저장한 에러 메세지를 출력한다.
- method 는 전송 방식(요청 방식), action 전송 목적지(어디로 form을 보낼건지), enctype 전송되는 데이터의 형식을 뜻한다.
- 우리는 게시물 작성에 파일 및 사진 첨부가 함께 있으므로 서버에 데이터를 전송할 때 사용하는 방식인 'multipart/form-data' 으로 설정한다.
- textarea 는 일곱 줄만큼의 사이즈를 갖도록 rows = 7 으로 설정한다.
{% extends 'base_.html' %}
{% block content %}
<div class = "container">
<div class = "row">
{% if errors %}
<ul>
{% for error in errors %}
<li><div class = "alert alert-primary" role = "alert">{{error}}</div></li>
{% endfor %}
</ul>
{% endif %}
<form method = "post" action = "{% url 'post_write' %}" enctype = "multipart/form-data" class = "col-lg-8 col-md-10 mx-auto">
{% csrf_token %}
<div class = "form-group row">
<label for = "title">제목</label>
<input type = "text" class = "form-control" name = "title" placeholder="제목을 입력해주세요.">
</div>
<div class = "form-group row">
<label for = "content">내용</label>
<textarea class = "form-control" name = "content" rows = "7"></textarea>
</div>
<div class = "form-group row">
<label for = "content">사진 첨부</label>
<input type = "file" class = "form-control" name = "image">
</div>
<div class = "form-group row float-right">
<button type = "submit" class = "btn btn-primary">저장하기</button>
</div>
</form>
</div>
</div>
{% endblock %}
django_blog/settings.py
- 게시물에 올리는 미디어 파일들을 관리하기 위해 media_root media_url을 설정해준다.
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
실행 결과
- 제대로 실행되는지 알기 위해, 작성해보고 admin 페이지를 확인한다.
- 위에서 작성한대로 관리자 페이지에서 Post 객체가 생성된 것을 확인할 수 있다.
- 또한 첨부한 이미지 파일이 media 폴더에 저장된 것을 알 수 있다.
'django project > 블로그' 카테고리의 다른 글
- Total
- Today
- Yesterday
- django pythoneverywhere
- Realtime Database
- iOS 데이터베이스
- pythonanywhere배포방법
- 까만 화면
- CellForRowAt 호출안됨
- cleaned_data
- CellForRowAt Not Called
- python 웹 배포
- 장고 태그달기
- Django
- django 태그
- django clean
- ModelForm Form 차이
- 알파벳 카운팅
- 테이블출력안됨
- django tag
- iOS 검은 화면
- django 로그인접근
- 실시간 데이터베이스
- UITableViewController Not Working
- 웹 배포
- 장고 게시판
- pythonanywhere배포
- 데이터베이스 추천
- iOS UITableView 출력안됨
- django 게시판
- django 개발일지
- iOS 화면 안나옴
- Firebase 데이터베이스 추천
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |