Category: Programming

0

Django - 블로그 post에 카테고리 추가하기

블로그 post list와 post detail 페이지에 카테고리 추가하기테스트 코드 작성하기 blog/tests.py post_001 = create_post( title="The second post", content="Second Second Second", author=self.author_000, category=create_category(name='정치/사회'))# category card에서 category_card = body.find('div', id='category-card') self.assertIn('미분류(1)', category_card.text) #### 미분류 (1)이 있어야 한다. self.assertIn('정치/사회(1)', category_card.text) #### 정치/사회(1)이 있어야 한다. main_div = body.find('div', id='main_div') self.assertIn('정치/사회', main_div.text) ###'정치/사회' 있어야 함 self.assertIn(('미분류', main_div.text)) ### '미분류' 있어야 함 id 추가하기 blog/templates/blog/base.html <div class="card my-4" id = "category-card"> 카테고리 카드 수정해주기 blog/views.py

0

Django - 블로그 post에 카테고리 추가하기

블로그 post에 카테고리 추가하기테스트 코드 작성하기 blog/tests.py # 카테고리 생성을 위한 코드def create_category(name='life', description=""): category, is_created = Category.objects.get_or_create( name=name, description=description ) return category# 카테고리를 테스트 하기 위한class TestModel(TestCase): def setUp(self): # 브라우저 역할을 해준다. self.client = Client() self.author_000 = User.objects.create( username='smith', password='nopassword') def test_category(self): category = create_category() def test_post(self): category = create_category( ) post_000 = create_post( title="The first post", content="Hello World. We are the world.", author=self.author_000, category=category ) # 카테고리에서 포스트를 불러오는 코드 self.assertEqual(category.post_set.count(), 1) 카테고리 만들어 주기 blog/models.py # 카테고리를 추가한다.class Category(models.Model): name = models.CharField(max_length=25) description = models.TextField(black=True) 전체 소스 코드from django.db import modelsfrom django.contrib.auth.models import User# Create your models here.# 카테고리를 추가한다.class Category(models.Model): # Category의 이름이 유일할 수 있게 unique옵션을 준다. name = models.CharField(max_length=25, unique=True) description = models.TextField(blank=True)class Post(models.Model): # 제목 title = models.CharField(max_length=30) # 내용 content = models.TextField() # 이미지 파일 저장을 위한 객체 # upload된 이미지 파일은 blog에 저장이 된다. blank = True는 공란이여도 된다는 의미이다. head_image = models.ImageField(upload_to='blog/%Y/%m/%d/', blank=True) # 작성 일자 created = models.DateTimeField() # 저자 author = models.ForeignKey(User, on_delete=models.CASCADE) # 카테고리 객체 추가 category = models.ForeignKey(Category, blank=True, null=True, on_delete=models.SET_NULL) # 해당 객체를 문자열로 바꿧을 때 어떤 식으로 보여줄 것인지를 결정한다. def __str__(self): # 작성된 페이지의 제목과 저자를 보여준다. return '{} :: {}'.format(self.title, self.author) # 포스트의 절대 경로를 얻기 위한 함 def get_absolute_url(self): return '/blog/{}/'.format(self.pk)

0

Django - read more 버튼 동작하게 하기, post_detail 페이지 개선하기

read more 버튼 동작하게 하기, post_detail 페이지 개선하기버튼 활성화 하기id 추가해주기 blog/templates/blog/post_list.html <!-- 버튼이 눌렸을 때 이동할 url과 button을 쉽게 찾기 위한 id를 추가한다. --><a href="{{ p.get_absolute_url }}" class="btn btn-primary" id="read-more-post-{{ p.pk }}">Read More&rarr;</a> 테스트 코드부터 작성하기 blog/tests.py # button 확인을 위한 코드post_000_read_more_button = body.find('a', id="read-more-post-{}".format(post_000.pk))self.assertEqual(post_000_read_more_button['href'], post_000.get_absolute_url()) post_detail 디자인 변경하기

0

Django - HTML 분리해서 관리하기

HTML 분리해서 관리하기 blog/templates/blog/base.html 추가 <div class="container"> <div class="row"> <!-- Blog Entries Column --> <div class="col-md-8"> {% block content %} {% endblock %} </div> blog/templates/blog/post_list 수정 {% extends 'blog/base.html' %}{% block content %}<!-- Blog Post -->{%if object_list.exists %}<!-- 포스트의 모든 게시물들을 하나씩 가져온다. -->{% for p in object_list %}<div class="card mb-4"> <!-- <img class="card-img-top" src="http://placehold.it/750x300" alt="Card image cap" /> --> {% if p.head_image %} <img class="card-img-top" src="{{p.head_image.url}}" alt="Card image cap" /> {% else %} <img class="card-img-top" src="https://picsum.photos/seed/picsum/750/300" alt="Card image cap" /> {% endif %} <div class="card-body"> <!-- 제목 --> <h2 class="card-title">{{p.title}}</h2> <!-- 내용 --> <p class="card-text"> {{p.content | truncatewords:50}} </p> <a href="#" class="btn btn-primary">Read More &rarr;</a> </div> <!-- 작성일과 작성자 --> <div class="card-footer text-muted"> Posted on {{p.created}} by <a href="#">{{p.author}}</a> </div></div>{%endfor%}{%else%}<h3>아직 게시물이 없습니다.</h3>{%endif%}{% endblock %} extends와 block을 이용하여 중복되는 템플릿을 삭제한 후 간단하게 만들어 주었다. blog/templates/blog/post_detail.html {% extends 'blog/base.html' %}{% block content %}<h1>{{object.title}}</h1><div> {{object.content}}</div>{% endblock %} 결과

0

Django - Post Detail 페이지 테스트 코드 작성하기

Post Detail 페이지 테스트 코드 작성하기절대 경로를 얻기 위함 함수 만들기 blog/models.py def get_absolute_url(self): return '/blog/{}/'.format(self.pk) admin 페이지내의 post에 view on site버튼이 활성화 된다. blog/tests.py def create_post(title, content, author): blog_post = Post.objects.create( title=title, content=content, created=timezone.now(), author=author, ) detail을 확인하기 위한 함수를 생성 blog/tests.py

0

Django - Post List 페이지 테스트 코드 작성하기 part A

Post Detail 페이지 만들기상세 페이지를 보여주기 위한 url을 추가한다. blog/urls.py from django.urls import path, includefrom .import viewsurlpatterns = [ # path('', views.index), path('<int:pk>/', views.post_detail()) path('', views.PostList.as_view()),] 상세 페이지를 보여주기 위한 view를 위한 코드를 작성 blog/views.py from django.shortcuts import renderfrom .models import Postfrom django.views.generic import ListView# Create your views here.# List로 보여줄 때는 django.views.generic의# ListView를 상속하여 보여주면 간단하게 보여줄 수 있다.class PostList(ListView): model = Post def get_queryset(self): # 역순으로 보여주기 위해 -로 붙인다. return Post.objects.order_by('-created')# 상세 페이지를 보여주기 위한 함수를 추가한다.def post_detail(request, pk): blog_post = Post.objects.get(pk=pk) return render( request, 'blog/post_detail.html', { 'blog_post': blog_post, } ) 상세 페이지를 위한 html 코드 만들기 blog/templates/blog/post_detail.html

0

Django - Post Detail 페이지 만들기

Post Detail 페이지 만들기상세 페이지를 보여주기 위한 url을 추가한다. blog/urls.py from django.urls import path, includefrom .import viewsurlpatterns = [ # path('', views.index), path('<int:pk>/', views.post_detail()) path('', views.PostList.as_view()),] 상세 페이지를 보여주기 위한 view를 위한 코드를 작성 blog/views.py from django.shortcuts import renderfrom .models import Postfrom django.views.generic import ListView# Create your views here.# List로 보여줄 때는 django.views.generic의# ListView를 상속하여 보여주면 간단하게 보여줄 수 있다.class PostList(ListView): model = Post def get_queryset(self): # 역순으로 보여주기 위해 -로 붙인다. return Post.objects.order_by('-created')# 상세 페이지를 보여주기 위한 함수를 추가한다.def post_detail(request, pk): blog_post = Post.objects.get(pk=pk) return render( request, 'blog/post_detail.html', { 'blog_post': blog_post, } ) 상세 페이지를 위한 html 코드 만들기 blog/templates/blog/post_detail.html

0

Django - template(html)에서 if문 사용하기

template(html)에서 if문 사용하기이미지가 있을 때만 나타내기{% if p.head_image %}<img class="card-img-top" src="{{p.head_image.url}}" alt="Card image cap"/>{% endif %} {% if %}문을 이용하여 처리를 한다. Lorem Picsum 이용하기{% if p.head_image %}<img class="card-img-top" src="{{p.head_image.url}}" alt="Card image cap"/>{% else %}<img class="card-img-top" src="https://picsum.photos/seed/picsum/750/300" alt="Card image cap"/>{% endif %} 이미지가 없을 경우 Lorem Picsum으로부터 이미지를 가져온다. 템플릿에서 truncate로 앞 내용만 보여주기{{p.content | truncatewords:50}}

0

Django - 사진 업로드를 위한 ImageField와 업로드된 파일 관리 방법

blog/models.py from django.db import modelsfrom django.contrib.auth.models import User# Create your models here.class Post(models.Model): # 제목 title = models.CharField(max_length=30) # 내용 content = models.TextField() # 이미지 파일 저장을 위한 객체 # upload된 이미지 파일은 blog에 저장이 된다. blank = True는 공란이여도 된다는 의미이다. head_image = models.ImageField(upload_to='blog/', blank=True) # 작성 일자 created = models.DateTimeField() # 저자 author = models.ForeignKey(User, on_delete=models.CASCADE) # 해당 객체를 문자열로 바꿧을 때 어떤 식으로 보여줄 것인지를 결정한다. def __str__(self): # 작성된 페이지의 제목과 저자를 보여준다. return '{} :: {}'.format(self.title, self.author) head_image = models.ImageField(upload_to='blog/', blank=True)를 추가했으므로 이제 이미지 파일을 올릴 수 있게 되었다.이렇게 할 경우 일반적으로 blog폴더에 계속 이미지 파일이 생기게 됨으로 settings.py에 가서 이미지가 저장될 수 있는 폴더를 설정해주어야 한다. 미디어가 저장될 기본 폴더 설정하기 mysite/settings.py MEDIA_ROOT = os.path.join(BASE_DIR, '_media') 이미지 파일이 _media폴더에 저장되게 된다. 날짜별로 사진 파일 저장하기 blog/models.py

0

Django - Bootstrap Grid

Bootstrap Gridcontainer blog/templates/blog/post_list.html <div class="container"> <h1>Blog</h1> <!-- 포스트의 모든 게시물들을 하나씩 가져온다. --> {% for p in object_list %} <!-- 제목 --> <h3>{{p.title}}</h3> <!-- 작성일과 작성자 --> <h4>{{p.created}} by {{p.author}}</h4> <!-- 내용 --> <p>{{p.content}}</p> {%endfor%}</div> 메인 페이지 디자인 변경하기 https://startbootstrap.com/templates/blog/ <!-- Page Content --><div class="container"> ...</div><!-- /.row --> bootstrap으로부터 페이지 container 변경을 위해 코드를 가져온다. 가져온 페이지 디자인에 콘텐츠 넣어주기

0

Django - navigation bar 만들기

navigation bar 만들기view-source:https://bootswatch.com/simplex/ <body> <!-- navigation bar 코드가 시작되는 부분 --> <div class="navbar navbar-expand-lg fixed-top navbar-light bg-light"> .... </div></body> 내용의 코드를 긁어서 blog/template/blog/post_list.html에 붙여준다.

0

Django - static File 관리하기 bootstrap 적용을 위해

static File 관리하기 : bootstrap 적용을 위해https://bootswatch.com/simplex/ bootstrap을 적용해보기 blog/templates/blog/post_index.html css 파일<meta name="viewport" content="width=device-width, initial-scale=1" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><link rel="stylesheet" href="../4/simplex/bootstrap.css" media="screen" /><link rel="stylesheet" href="../_assets/css/custom.min.css" /> javascript 파일 blog/templates/blog/post_index.html <script src="../_vendor/jquery/dist/jquery.min.js"></script><script src="../_vendor/popper.js/dist/umd/popper.min.js"></script><script src="../_vendor/bootstrap/dist/js/bootstrap.min.js"></script><script src="../_assets/js/custom.js"></script>

0

Django - FBV -> MBV 블로그 포스트 리스트

blog/view.py변경전 from django.shortcuts import renderfrom .models import Postdef index(request): # Post의 내용들을 전부 다 가져온다. posts = Post.objects.all() return render( request, # 템블릿이 되는 html 코드를 작성할 필요가 있다. 'blog/index.html', # index.html에서 사용하도록 객체를 넘겨주고 있다. # template에 전해주고 싶은 것들을 적어주면 된다. { 'posts': posts, } ) 변경후 from django.shortcuts import renderfrom .models import Postfrom django.views.generic import ListView# Create your views here.class PostList(ListView): model = Post blog/urls.py urlpatterns = [ path('', views.index),] urlpatterns = [ path('', views.PostList.as_view()),] blog/templates/blog/post_list.html 생성 <!DOCTYPE html><html lang="ko"> <head> <meta charset="UTF-8" /> <title>Blog</title> </head> <body> <h1>Blog</h1> <!-- 포스트의 모든 게시물들을 하나씩 가져온다. --> {% for p in object_list %} <!-- 제목 --> <h3>{{p.title}}</h3> <!-- 작성일과 작성자 --> <h4>{{p.created}} by {{p.author}}</h4> <!-- 내용 --> <p>{{p.content}}</p> {%endfor%} </body></html>

0

Django - MTV 구조 맛보기 model, views, templates 사용하기

mysite/urls.py from django.contrib import adminfrom django.urls import path, includeurlpatterns = [ path('admin/', admin.site.urls), path('blog/', include('blog.urls')),] blog/url.py 추가 from django.urls import path, includefrom .import viewsurlpatterns = [ path('', views.index),] blog/views.py from django.shortcuts import render# Create your views here.def index(request): return render( request, # 템블릿이 되는 html 코드를 작성할 필요가 있다. 'blog/index.html' ) blog/templates/blog/index.html <!DOCTYPE html><html lang="ko"> <head> <meta charset="UTF-8" /> <title>Blog</title> </head> <body> <h1>Blog</h1> </body></html> blog/views.py

0

Django - 지역(시간) 세팅 수정하기, Post 개선하기 str

django 지역(시간) 세팅 수정하기, Post 개선하기 str시간 세팅 수정하기 mysite/setting.py TIME_ZONE = 'UTC' TIME_ZONE = 'Asia/Seoul' str 추가하기 blog/model.py from django.db import modelsfrom django.contrib.auth.models import User# Create your models here.class Post(models.Model): # 제목 title = models.CharField(max_length=30) # 내용 content = models.TextField() # 작성 일자 create = models.DateTimeField() # 저자 author = models.ForeignKey(User, on_delete=models.CASCADE) # 해당 객체를 문자열로 바꿧을 때 어떤 식으로 보여줄 것인지를 결정한다. def __str__(self): # 작성된 페이지의 제목과 저자를 보여준다. return '{} :: {}'.format(self.title, self.author)