Home

0

Django - 사소한 문제들 해결(불필요한 내용 삭제하기; category 복수형 수정하기 (categorys -> categories))

사소한 문제들 해결: 불필요한 내용 삭제하기; category 복수형 수정하기 (categorys -> categories)post_detail에 카테고리 반영하기 blog/models.py def get_context_data(self, *, object_list=None, **kwargs): context = super(PostList, self).get_context_data(**kwargs) context['category_list'] = Category.objects.all() # Post들 중에서 category가 None인 것의 갯수를 가져온다. context['posts_without_category'] = Post.objects.filter(category=None).count() return context blog/tests.py def check_right_side(self, soup): category_card = soup.find('div', id='category-card') self.assertIn('미분류(1)', category_card.text) #### 미분류 (1)이 있어야 한다. self.assertIn('정치/사회(1)', category_card.text) #### 정치/사회(1)이 있어야 한다.# category가 잘 작동하는지 확인하기self.check_right_side(soup)

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