본문 바로가기

Python_WEB/Django_Tutorial

[Django]Blog Creation Tutorial(Translation/Correction) 3

원문>

https://matthewdaly.co.uk/blog/2012/03/24/yet-another-tutorial-for-building-a-blog-using-python-and-django-part-3/

 

Yet Another Tutorial for Building a Blog Using Python and Django - Part 3 - Matthew Daly's Blog

24th March 2012 6:23 pm Yet Another Tutorial for Building a Blog Using Python and Django - Part 3 Welcome back! In this installment, we’ll make some changes to our URL structure for blog posts, we’ll add support for multiple authors and static pages, a

matthewdaly.co.uk

 

번역 / 수정>

장고 쉘 사용법을 알아보자.

일반 쉘이랑 틀린 점은 장고 쉘은 장고에 모든 기능을 사용할 수 있다.

앞에 더미 데이터를 만들었으므로 사용을 해보자.

또한, 작성자를 만들어서 포스트 내용에 작성자를 표현해본다.

(현재 일부 기능은 작동하지 않음(변경 방법 구색))

 

1. 장고 쉘

python manage.py shell

 

2. Post 객체에 접근

from blogengine.models import Post

 

3. 저장된 데이터를 모두 조회

Post.objects.all()

<QuerySet [<Post: Etiam sit amet ligula>, <Post: Vivamus ligula tellus>, 

<Post: Maecenas non pulvinar magna>, <Post: In dignissim feugiat imperdiet>, 

<Post: Fusce bibendum neque sed>, <Post: Sed suscipit ultrices imperdiet>, 

<Post: 감사원은 세입 세출>]>

블로그 포스트는 제목으로 표현된다.

 

4. Primary Key(id)가 1인 Post객체 표시

p = Post.objects.get(pk=1)
p
p = Post.objects.get(id=1)
p

<Post: Etiam sit amet ligula>

pk = id
기본 키는 테이블의 한 항목을 고유하게 참조하는 데이터베이스 테이블의 값을 말한다.

 

5. 게시글의 날짜를 확인

p.pub_date

datetime.datetime(2020, 5, 13, 12, 1, 33, tzinfo=<UTC>)

datetime.datetime개체가 반환된다.

 

6. 게시글의 년도를 확인

p.pub_date.year

2020

 

7. 게시글의 월을 확인

p.pub_date.month

5

 

8. 게시글의 일을 확인

p.pub_date.day

13

 

9. models(blogengine>models.py)

원문 코드>

from django.db import models
from django.contrib.auth.models import User


class Post(models.Model):
    title = models.CharField(max_length=200)
    pub_date = models.DateTimeField()
    text = models.TextField()
    slug = models.SlugField(max_length=40, unique=True)
    author = models.ForeignKey(User)
    
    def __unicode__(self):
        return self.title

 

수정 코드>

from django.db import models
from django.contrib.auth.models import User


class Post(models.Model):
    title = models.CharField(max_length=200)
    pub_date = models.DateTimeField()
    text = models.TextField()
    slug = models.SlugField(max_length=40, unique=True,
                            allow_unicode=True, null=False)
    author = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        return self.title
on_delete=models.CASCADE
ForeignKeyField가 바라보는 값이 삭제될 때 ForeignKeyField를 포함하는 모델 인스턴스도 삭제된다.

 

10. admin(blogengine>admin.py)

원문 코드>

import models
from django.contrib import admin
from django.contrib.auth.models import User


class PostAdmin(admin.ModelAdmin):
    prepopulated_fields = {"slug": ("title",)}
    exclude = ('author',)
    
    def save_model(self, request, obj, form, change):
        obj.author = request.user
        obj.save()
        
admin.site.register(models.Post, PostAdmin)

 

수정 코드>

from django.contrib import admin
from django.contrib.auth.models import User

from .models import Post


class PostAdmin(admin.ModelAdmin):
    prepopulated_fields = {"slug": ("title",)}
    exclude = ('author',)

    def save_model(self, request, obj, form, change):
        obj.author = request.user
        obj.save()

admin.site.register(Post, PostAdmin)
사용자 모델을 가져오고 PostAdmin클래스 정의에서 작성자 필드를 제외한다.

 

11. 장고 쉘

python manage.py shell

 

12. default(templates>default.html)

원문 코드>

<html>
    <head>
        <title>My Django Blog</title>
    </head>
    <body>
        <h1>{{ flatpage.title }}</h1>
        {{ flatpage.content }}
    </body>
</html>

 

수정 코드>

<html>
  <head>
    <title>My Django Blog</title>
  </head>
  <body>
    {% block content %}
	{% endblock %}
  </body>
</html>
{% block content %} {% endblock %}
default.html을 상속한 템플릿에서 구현되는 부분이다.

 

13. posts(templates>posts.html)

원문 코드>

{% include 'header.html' %}
        {% for post in posts %}
        <h1><a href="{{ post.get_absolute_url }}">{{ post.title }}</a></h1>
        <h3>{{ post.pub_date }}</h3>
        {{ post.text }}
        <h3>By {{ post.author.first_name }} {{ post.author.last_name }}</h3>
        {% endfor %}
        <br />
        {% if page.has_previous %}
        <a href="/{{ page.previous_page_number }}/">Previous Page</a>
        {% endif %}
        {% if page.has_next %}
        <a href="/{{ page.next_page_number }}/">Next Page</a>
        {% endif %}
{% include 'footer.html' %}

 

수정 코드>

{% extends 'default.html' %}
  {% block content %}
  {% for post in posts %}
    <h1><a href="/blog/{{ post.slug }}">{{ post.title }}</a></h1>
    <h3>{{ post.pub_date }}</h3>
  	{{ post.text }}
    <h3>by {{ post.author }}</h3>
  {% endfor %}
  <br />
  {% if page.has_previous %}
    <a href="/blog/{{ page.previous_page_number }}/">Previous Page</a>
  {% endif %}
  {% if page.has_next %}
    <a href="/blog/{{ page.next_page_number }}/">Next Page</a>
  {% endif %}
{% endblock %}
{% extends 'default.html' %}
default.html을 상속 받는다.

 

14. 테스트 화면

- 작성자 표시

 

- 데이터베이스 구조