Category: Django

0

Django - App 생성하기

목차 Django - App 생성하기 Django - 장고 시작하기 장고 앱 만들기장고 App 생성은 manage.py 가 있는 프로젝트 폴더에서 startapp 명령어를 사용합니다. startapp 명령어를 사용해 hello_world 라는 이름의 앱을 만들어 줍니다. python manage.py startapp hello_world view.py 작성하기앱 폴더 내에 views.py 파일에 다음과 같은 코드를 작성해줍니다. from django.http import HttpResponsedef hello(request): return HttpResponse("Hello, world. You're at the hello_world index.")# Create your views here.] url.py 작성하기

0

Django - 장고 시작하기

목차 Django - App 생성하기 Django - 장고 시작하기 장고 설치하기pip install django 장고 프로젝트 생성하기 - django-admindjango 를 설치하면 django-admin 명령어를 사용할 수 있습니다. 설치된 django-admin 에 startproject 명령어를 사용하면 새롭게 장고 프로젝트를 시작할 수 있습니다. django-admin startproject mysite 장고 서버 실행하기 - manage.py새로운 장고 프로젝트에 들어가면 manage.py 파일이 있습니다. runserver 명령어를 사용하면 장고 서버를 실행할 수 있습니다.

0

Django Rest - 장고를 이용한 rest api 만들기

장고를 이용한 rest api 만들기settings myapi/settings.py STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') 정적 파일 root 추가 INSTALLED_APPS = [ ... 'rest_framework',] INSTALLED_APPS에 quiz와 rest_framework를 추가해준다. 모델 생성하기 quiz/models.py

0

Django - Comment (댓글) view 구현하기

Comment (댓글) view 구현하기테스트 코드 작성 blog/tests.py # Comment를 생성한다.comment_000 = create_post(post_000, text='a test comment', author=self.author_obama) # Comment comments_div = main_div.find('div', id='comment-list') self.assertIn(comment_000.author.username, comments_div.text) self.assertIn(comment_000.text, comments_div.text) post_detail 수정하기 blog/templates/blog/post_detail.html <!-- Comment --><div id="comment-list">{% for comment in object.comment_set.all %} <div class="media mb-4"> <img class="d-flex mr-3 rounded-circle" src="http://placehold.it/50x50" alt=""> <div class="media-body"> <h5 class="mt-0">{{ comment.author }}</h5> {{ comment.get_markdwon_content | safe }} </div> </div>{% endfor %}</div> admin 사이트에서 comment확인할 수 있게 반영하기 blog/admin.py

0

Django - Comment (댓글) 작성창 구현하기

Comment (댓글) 작성창 구현하기forms.py 파일 생성하기 blog/ 해당 돌더에 forms.py 파일을 생성한다. from .models import Commentfrom django import formsclass CommentForm(forms.ModelForm): class Meta: model = Comment fields = {'text',} 테스트 코드 작성하기 blog/tests.py # 로그인하기login_success = self.client.login(username='smith', password='nopassword')self.assertTrue(login_success)# post를 이용하여 서버에 데이터를 보낸다.response = self.client.post( post_000.get_absolute_url() + 'new_comment/', {'text':'A test comment for the first comment'}, follow=True # redirect하는 것까지 확인을 해봐라)self.assertEqual(response.status_code, 200) views.py에 반영하기

0

Django - 블로그 post list와 post detail 페이지에 카테고리 추가하기

블로그 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 - Comment (댓글) 모델 구현하기

Comment (댓글) 모델 구현하기테스트 코드 작성하기 blog/tests.py # commnet를 생성하는 함수def create_comment(post, text='a comment', author=None): if author is None: author, is_created = User.objects.get_or_create( username='guset', password='guestpassword' ) comment = Comment.objects.create( post = post, text = text, author = author ) return comment # class test_Model에 추가 # 댓글 기능에 관한 test def test_comment(self): post_000 = create_post( title="The first post", content="Hello World. We are the world.", author=self.author_000, ) self.assertEqual(Comment.objects.count(), 0) comment_000 = create_comment( post=post_000 ) comment_001 = create_comment( post=post_000, text='second comment' ) self.assertEqual(Comment.objects.count(), 2) self.assertEqual(post_000.comment_set.count(), 2) comment 모델 추가하기 blog/models.py class Comment(models.Model): post = models.ForeignKey(Post, on_delete=models.CASCADE) text = MarkdownxField() author = models.ForeignKey(User, on_delete=models.CASCADE)

0

Django - 로그인 사용자만 접속 가능하게 하기

로그인 사용자만 접속 가능하게 하기테스트 코드 작성 blog/tests.py # post_create를 확인하기 위한 테스트 코드def test_post_create(self): response = self.client.get('/blog/create/') # 로그인 하지 않은 상태에서는 create로 접속시에 200이 뜨면 안된다. self.assertNotEqual(response.status_code, 200) # 로그인을 했을 때만 create로 접속시 200이 뜨게 해야 한다. self.client.login(username='smith', password='nopassword') response = self.client.get('/blog/create/') self.assertEqual(response.status_code, 200) # 정상적으로 이루어진 경우 BeautifulSoup을 이용해 html.parser로 파싱한 객체를 생성한다. soup = BeautifulSoup(response.content, 'html.parser') main_div = soup.find('div', id='main-div') # self.assertIn('New Post', main_div.text) 뷰 수정하기 blog/views.py from django.contrib.auth.mixins import LoginRequiredMixinclass PostCreate(LoginRequiredMixin, CreateView): model = Post fields = [ 'title', 'content', 'head_image', 'category', # 'tags' ] def form_valid(self, form): # 작성자를 가지고 온다. current_user = self.request.user # 로그인을 한 상태인지 확인을 한다. if current_user.is_authenticated: # form의 author를 현재 작성중인 사람으로 채워 넣어 form.instance.author = current_user return super(type(self), self).form_valid(form) else : return redirect('/blog/') PostCreate에서 LoginRequiredMixin을 추가적으로 상속한다.

0

Django - Post 작성 화면 / 기능 구현하기

Post 작성 화면 / 기능 구현하기new 버튼 만들기 blog/templates/post_list.html <!--로그인 한 사용자에게만 보이게 하기-->{% if user.is_authenticated %} <!-- new post button 만들기 --> <button class="btn btn-primary btn-sm float-right" onclick="location.href='/blog/create/'">new post</button>{% endif %} post_create 만들기테스트 코드 작성 blog/tests.py # post_create를 확인하기 위한 테스트 코드def test_post_create(self): response = self.client.get('/blog/create/') self.assertEqual(response.status_code, 200) # 정상적으로 이루어진 경우 BeautifulSoup을 이용해 html.parser로 파싱한 객체를 생성한다. soup = BeautifulSoup(response.content, 'html.parser') main_div = soup.find('div', id='main-div') # self.assertIn('New Post', main_div.text) url 추가하기

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