Home

0

Django - Post 수정 화면 / 기능 구현하기

Post 수정 화면 / 기능 구현하기update된 url을 반환하는 함수 만들어 주기 blog/models.py # update된 url을 반환하기 위한 함수def get_update_url(self): return self.get_absolute_url() + 'update/' update된 url로 접속하기 blog/views.py from django.views.generic import UpdateViewclass PostUpdate(UpdateView): model = Post # post의 모든 field를 가져와라 field = '__all__' blog/urls.py from django.urls import path, includefrom .import viewsurlpatterns = [ # path('', views.index), # path('<int:pk>/', views.post_detail), path('category/<str:slug>/', views.PostListByCategory.as_view()), path('<int:pk>/update/', views.PostUpdate.as_view()), path('<int:pk>/', views.PostDetail.as_view()), path('', views.PostList.as_view()),]

0

Django - 마크다운적용하기, tag field에 공란 허용하기

마크다운적용하기, tag field에 공란 허용하기 post에 그림이 나타나게 해주기 줄바꿈이 적용될 수 있게 바꿔주기 -> 마크다운 이용하기 post에 그림이 나타나게 해주기 blog/templates/blog/post_detail.html <img class="img-fluid rounded" src="{{object.head_image.url}}" alt=""> 줄바꿈이 적용될 수 있게 바꿔주기 -> 마크다운 이용하기https://neutronx.github.io/django-markdownx/ pip install django-markdownx 앱 추가하기

0

Django - Post Detail 개선사항 도출하고 Test 코드 만들기

Post Detail 개선사항 도출하고 Test 코드 만들기 post에 카테고리 표시하기 edit 버튼 만들기 post에 그림이 나타나게 해주기 줄바꿈이 적용될 수 있게 바꿔주기 -> 마크다운 이용하기 post에 카테고리 표시하기테스트 코드 만들어주기 blog/tests.py self.assertIn(category_politics.name, main_div.text) # category가 main_div에 있다.self.assertNotIn('EDIT', main_div.text) # EDIT 버튼이 로그인 하지 않은 경우 보이지 않는다.login_success = self.client.login(username='smith', password='nopassword') # login을 한 경우에는self.assertTrue(login_success)response = self.client.get(post_000_url)self.assertEqual(response.status_code, 200)soup = BeautifulSoup(response.content, 'html.parser')main_div = soup.find('div', id='main-div')self.assertEqual(post_000.author, self.author_000) # post.author와 login한 사람이 같으면self.assertIn('EDIT', main_div.text) # EDIT button이 있다. blog/templates/blog/post_detail.html {% if p.category %}<!-- badge가 오른쪽에 붙을 수 있게 float-right옵션을 이용한다. --><span class="badge badge-primary float-right">{{ p.category }}</span>{% else %}<span class="badge badge-primary float-right">미분류</span>{% endif %} post_list.html로부터 category부분의 내용을 post_detail.html에 붙여준다.

0

Django - Category 페이지 만들기 (slugField)

Category 페이지 만들기 (slugField)Category에 get_absolute_url추가하기 blog/models.py # Create your models here.# 카테고리를 추가한다.class Category(models.Model): # Category의 이름이 유일할 수 있게 unique옵션을 준다. name = models.CharField(max_length=25, unique=True) description = models.TextField(blank=True) # unicode를 허용한다. # slug를 이용하여 url에 카테고리가 뜰 수 있게 해준다. slug = models.SlugField(unique=True, allow_unicode=True) def get_absoulte_url(self): return '/blog/category/{}/'.format(self.slug) # 카테고리 이름을 출력해준다. def __str__(self): return self.name class Meta: verbose_name_plural = 'categories' admin에 slug가 자동으로 생성 될 수 있게하기 blog/admin.py from django.contrib import adminfrom .models import Post, Category# Register your models here.class CategoryAdmin(admin.ModelAdmin): # 미리 만들어지는 field # slug를 자동으로 만들어준다. prepopulated_fields = {'slug': ('name', )}admin.site.register(Post)admin.site.register(Category, CategoryAdmin) url 만들어주기 blog/urls.py

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