글을 작성하기

폼 생성

  • 모델(model)을 이용하면 ModelForm을 생성하여 자동으로 모델에게 결과물을 저장할 수 있음.
    • form model을 import, Post model도 import
    • PostForm : 만들 폼의 이름.  매개변수로 ModelForm이라는 것을 알려줌
    • class Meta : 어떤 model을 사용해 폼을 만들지 알려줌(medel = Post)
    • 폼의 필드를 넣어줌
#blog/forms.py

from django import forms
from .models import Post

class PostForm(forms.ModelForm):

    class Meta:
        model = Post
        fields = ('title', 'text',)

base.html 탬플릿 수정

  • 뷰의 이름이 post_new이며, "더하기 기호"가 보임
#blog/templates/blog/base.html

{% load static %}
<html>
    <head>
        <title>Django Girls blog</title>
        <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
        <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css">
        <link href='//fonts.googleapis.com/css?family=Lobster&subset=latin,latin-ext' rel='stylesheet' type='text/css'>
        <link rel="stylesheet" href="{% static 'css/blog.css' %}">
    </head>
    <body>
        <div class="page-header">
            <!-- 아래줄이 추가된 부분 -->
            <a href="{% url 'post_new' %}" class="top-menu"><span class="glyphicon glyphicon-plus"></span></a>
            <h1><a href="/">Django Girls Blog</a></h1>
        </div>
        <div class="content container">
            <div class="row">
                <div class="col-md-8">
                    {% block content %}
                    {% endblock %}
                </div>
            </div>
        </div>
    </body>
</html>

 

URL 수정

#blog/urls.py

from django.urls import path 
from . import views

urlpatterns = [
    path('', views.post_list, name='post_list'),
    path('post/<int:pk>/', views.post_detail, name='post_detail'),
    # 아래 줄이 추가된 부분
    path('post/new/', views.post_new, name='post_new'),
]

veiws 수정

  • 폼을 추가하기 위해서 PostForm 함수를 호출
#blog/views.py

from .forms import PostForm
from django.shortcuts import redirect




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})

새로운 탬플릿 추가

#blog/templates/blog/post_edit.html

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

{% block content %}
    <h1>New post</h1>
    <form method="POST" class="post-form">{% csrf_token %}
        {{ form.as_p }}
        <button type="submit" class="save btn btn-default">Save</button>
    </form>
{% endblock %}

글을 수정하기

탬플릿 수정

#blog/templates/blog/post_detail.html

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

{% block content %}
    <div class="post">
        {% if post.published_date %}
            <div class="date">
                {{ post.published_date }}
            </div>
        {% endif %}
        <!-- 아래줄 추가됨-->
        <a class="btn btn-default" href="{% url 'post_edit' pk=post.pk %}"><span class="glyphicon glyphicon-pencil"></span></a>
        <h1>{{ post.title }}</h1>
        <p>{{ post.text|linebreaksbr }}</p>
    </div>
{% endblock %}

URL 추가

 path('post/<int:pk>/edit/', views.post_edit, name='post_edit'),

 

탬플릿 추가

  • 기존 post_edit 탬플릿을 재사용

views 추가

#blog/views.py

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})

+ Recent posts