DevHyun

[DevHyun's Blog] Django&Python으로 만든 Blog 개선하기! 본문

Web/Django&Python Blog Projecct

[DevHyun's Blog] Django&Python으로 만든 Blog 개선하기!

D3V3L0P3R 2020. 10. 27. 19:36

d3v3lop3r.tistory.com/category/Web/Django%26Python%20Blog%20Projecct

 

'Web/Django&Python Blog Projecct' 카테고리의 글 목록

Developer Windows - Delphi, C# Web - Python-Django, JS, ASP DB - MS-SQL, Oracle, MySQL, Mongo-DB Github - https://github.com/jnhn333 LinkedIn - https://www.linkedin.com/in/jong-hyun-park-1454261b3/ Email - d3vhyun@gmail.com

d3v3lop3r.tistory.com

장고걸스 코치들과 자원봉사자들의 수고로 번역된 글을 참고하였습니다.

tutorial.djangogirls.org/ko

 

지금까지 Django&Python으로 만든 Blog를 개선해보고자 합니다!

- 미리 보기로 블로그 글 저장하기(임시저장)

- 게시되지 않은 블로그 글 목록 페이지 만들기

- 게시 버튼 추가하기

- 블로그 글 삭제하기

- 로그인 페이지 만들기 전 모든 권한 주기

 

- 미리 보기로 블로그 글 저장하기(임시저장)

- 게시되지 않은 블로그 글 목록 페이지 만들기

1. Blog/views.py에서 post_new 메소드와 post_edit 메소드에서 post.published_date = timezone.now() 부분 삭제

* Blog/views.py

* 새로 작성한 글이 바로 게시되지 않고 미리 볼 수 있는 초안으로 저장이 됩니다.

...
..
.
def post_new(request):
    if request.method == "POST":
        form = PostForm(request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            post.author = request.user
            # post.published_date = timezone.now()
            post.save()
            return redirect('post_detail', pk=post.pk)
    else:
        form = PostForm()
    return render(request, 'Blog/post_edit.html', {'form': form})

def post_edit(request, pk):
    post = get_object_or_404(Post, pk=pk)
    if request.method == "POST":
        form = PostForm(request.POST, instance=post)
        if form.is_valid():
            post = form.save(commit=False)
            post.author = request.user
            # post.published_date = timezone.now()
            post.save()
            return redirect('post_detail', pk=post.pk)
    else:
        form = PostForm(instance=post)
    return render(request, 'Blog/post_edit.html', {'form': form})

def admin(request): return HttpResponse(admin)

 

2. base.html 에서 edit 버튼 추가

* Blog/templates/Blog/base.html

 

<!DOCTYPE html>
{% load static %}
<html>
...
..
.
    <body>
        <div class ="page-header">
...
..
.
            <a href="{% url 'post_draft_list' %}" class="top-menu"><span class="glyphicon glyphicon-edit"></span></a>
            <h1><a href="{% url 'post_list' %}">DevHyun's Blog</a></h1>
        </div>
...
..
.
    </body>
</html>

 

3. urls.py에서 post_draft_list 추가

* Blog/urls.py

...
..
.

urlpatterns = [
...
..
.
   path('post/draft', views.post_draft_list, name='post_draft_list'),
]

 

 

∨ url 매핑 관련 참고 사이트

pythonstudy.xyz/python/article/311-URL-%EB%A7%A4%ED%95%91

 

예제로 배우는 파이썬 프로그래밍 - URL 매핑

1. Django App URL 매핑 하나의 프로젝트 내에 여러 Django App이 존재한다면, 프로젝트 폴더 내의 메인 urls.py 파일 하나로 모든 URL 매핑을 하기 보다는 각각의 Django App 안에 urls.py 파일을 만들고 메인 url

pythonstudy.xyz

4. views.py에 post_drfat_list View 생성

* Blog/views.py

...
..
.

def post_draft_list(request):
    posts = Post.objects.filter(published_date__isnull=True).order_by('created_date')
    return render(request, 'Blog/post_draft_list.html', {'posts': posts})

 

5. post_draft_list.html 생성

* Blog/templates/Blog/post_draft_list.html

 

{% extends 'Blog/base.html' %}

{% block content %}
    {% for post in posts %}
        <div class="post">
            <p class="date">created: {{ post.created_date|date:'d-m-Y' }}</p>
            <h1><a href="{% url 'post_detail' pk=post.pk %}">{{ post.title }}</a></h1>
            <p>{{ post.text|truncatechars:200 }}</p>
        </div>
    {% endfor %}
{% endblock %}

 

- 게시버튼 생성하기

 

6. post_detail.html 에서 게시버튼 추가하기

* Blog/templates/Blog/post_detail_list.html

{% if post.published_date %}
    <div class="date">
        {{ post.published_date }}
    </div>
{% else %}
    <a class="btn btn-default" href="{% url 'post_publish' pk=post.pk %}">Publish</a>
{% endif %}

* published_date 값이 비어있다면 버튼 보여주기!

 

7. urls.py에서 publish와 관련된 url패턴 추가하기

* Blog/urls.py

from django.urls import path
from . import views
urlpatterns = [
...
..
.
    path('post/<int:pk>/publish/', views.post_publish, name='post_publish'),
]

 

8. views.py에서 post_publish view 추가하기

* Blog/views.py

...
..
.

def post_publish(request, pk):
    post = get_object_or_404(Post, pk=pk)
    post.publish()
    return redirect('post_detail', pk=pk)

 

- 게시글 삭제버튼 생성하기

9. post_detail.html에서 수정버튼 아래에 삭제버튼 추가하기

* Blog/templates/Blog/post_detail.html

 

{% extends 'Blog/base.html' %}

{% block content %}
    <div class="post">
...
..
.
        <a class="btn btn-default" href="{% url 'post_edit' pk=post.pk %}"><span class="glyphicon glyphicon-pencil"></span></a>
        <a class="btn btn-default" href="{% url 'post_remove' pk=post.pk %}"><span class="glyphicon glyphicon-remove"></span></a>
        <h1>{{ post.title }}</h1>
        <p>{{ post.text|linebreaksbr }}</p>
    </div>
{% endblock %}

 

10. urls.py에 url 패턴(remove) 추가하기

* Blog/urls.py

from django.urls import path
from . import views
urlpatterns = [
...
..
.
    path('post/<int:pk>/remove/', views.post_remove, name='post_remove'),
]

 

11. views.py에서 remove view 추가하기

* Blog/view.py

...
..
.

def post_remove(request, pk):
    post = get_object_or_404(Post, pk=pk)
    post.delete()
    return redirect('post_list')

 

- 로그인 페이지 만들기 전 모든 권한 주기

 

12. views.py에서 get_user_model import 후 author를 admin(superuser)로 지정하기

* Blog/views.py

 

...
..
.
from django.contrib.auth import get_user_model

def post_new(request):
            post.author = get_user_model().objects.get(username='admin')
...
..
.

def post_edit(request, pk):
            post.author = get_user_model().objects.get(username='admin')
...
..
.

13. base.html에서 버튼을 다 보이게 만들기 (if문 제거)

* Blog/templates/Blog/base.html

 

<!DOCTYPE html>
{% load static %}
<html>
...
..
.
    <body>
        <div class ="page-header">
            <a href="{% url 'post_new' %}" class="top-menu"><span class="glyphicon glyphicon-plus"></span></a>
            <a href="{% url 'post_draft_list' %}" class="top-menu"><span class="glyphicon glyphicon-edit"></span></a>
            <h1><a href="{% url 'post_list' %}">DevHyun's Blog</a></h1>
        </div>
...
..
.
    </body>
</html>

 

14. run-> pythonanywhere에 재배포

d3v3lop3r.tistory.com/18

 

[DevHyun's Blog] Pythonanywhere 에서 Git Project Pull 한 후 재배포 하기

장고걸스 코치들과 자원봉사자들의 수고로 번역된 글을 참고하였습니다. tutorial.djangogirls.org/ko Blog App에서 수정사항이 있을경우 Pycharm에서 Commit-Push 한 후에 Pythonanywhere에서 pull 해줘야 동기화..

d3v3lop3r.tistory.com

 

Comments