월 26,400원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결Do It! 장고+부트스트랩: 파이썬 웹개발의 정석
modal을 모듈화 안하였을때는 google 버튼을 <a> 로 바꾸었을때 에러가 났는데 모듈화 하니까 에러가 안납니다 왜그런걸까요?
제목이 곧 내용입니다.
- 미해결Do It! 장고+부트스트랩: 파이썬 웹개발의 정석
아래 Cooper Bean님과 동일한 오류가 발생하여 질문 남깁니다.
지금 강의 마지막 부분에서 이런 에러가 발생했습니다. 만들고 있는 홈페이지에서 tag 수정기능은 제대로 작성하는데, 테스트에서는 통과를 못하고 있습니다. 이번 강의에서 진행한 내용 중 오타는 발견 못했는데, test 폴더에 test_update_post 내용 중 잘못된 것이 있나해서 github 주소와같이 보내봅니다. 감사합니다.github 주소 :https://github.com/ATM7587/do_it_django_inflearn_2021 def test_update_post(self): update_post_url = f'/blog/update_post/{self.post_003.pk}/' # 로그인 하지 않은 상태에서 접근 하는 경우 response = self.client.get(update_post_url) self.assertNotEqual(response.status_code, 200) # 로그인은 했지만, 작성자가 아닌 경우 self.assertNotEqual(self.post_003.author, self.user_trump) self.client.login(username='trump', password='somepassword') response = self.client.get(update_post_url) self.assertNotEqual(response.status_code, 200) # user_obama가 아니므로 정상실행이 되지 않음 # 작성자(obama)가 접근하는 경우 self.assertEqual(self.post_003.author, self.user_obama) self.client.login(username='obama', password='somepassword') response = self.client.get(update_post_url) self.assertEqual(response.status_code, 200) # user_obama 이므로 정상적으로 실행됨 soup = BeautifulSoup(response.content, 'html.parser') self.assertEqual('Edit Post - Blog', soup.title.text) main_area = soup.find('div', id='main-area') self.assertIn('Edit Post', main_area.text) tag_str_input = main_area.find('input', id='id_tags_str') self.assertTrue(tag_str_input) self.assertIn('파이썬 공부; python', tag_str_input.attrs['value']) response = self.client.post( update_post_url, { 'title': '세 번째 포스트를 수정했습니다.', 'content': '안녕 세계? 우리는 하나!', 'category': self.category_music.pk, 'tags_str': '파이썬 공부; 한글 태그, some tag' # 위의 '파이썬 공부; python' 에서 'python'은 사라지고 '파이썬 공부' 만 남는지 확인 }, follow=True ) soup = BeautifulSoup(response.content, 'html.parser') main_area = soup.find('div', id='main-area') self.assertIn('세 번째 포스트를 수정했습니다.', main_area.text) self.assertIn('안녕 세계? 우리는 하나!', main_area.text) self.assertIn(self.category_music.name, main_area.text) self.assertIn('파이썬 공부', main_area.text) self.assertIn('한글 태그', main_area.text) self.assertIn('some tag', main_area.text) self.assertNotIn('python', main_area.text)
- 미해결Do It! 장고+부트스트랩: 파이썬 웹개발의 정석
혹시 밑에 남겨둔 질문 한번 확인해주실 수 있을까요??
감사합니다.
- 해결됨Do It! 장고+부트스트랩: 파이썬 웹개발의 정석
urls.py를 분리하는 이유 질문입니다
강의 초반 부에 blog/urls.py를 생성해서 코드를 작성하는데 프로젝트 폴더 내에 urls.py가 있음에도 따로 분리해서 사용하는 것은 app별로 구분해서 식별하기가 쉽게끔 하기 위해서 하는 건가요? 만약에 blog 폴더에 따로 urls.py 만들지 않고 프로젝트 폴더 내에 있는 urls.py 안에서 모든 url 코드를 다 작성한다면 나중에 추가 되는 부분들, 예를 들면 path('search/<str:q>/', views.PostSearch.as_view()), path('delete_comment/<int:pk>/', views.delete_comment), 이렇게 작성하는 것을 path('blog/search/<str:q>/', views.PostSearch.as_view()), path('blog/delete_comment/<int:pk>/', views.delete_comment), 이런식으로 작성해도 기능에는 아무런 문제가 없는건가요?
- 미해결Do It! 장고+부트스트랩: 파이썬 웹개발의 정석
태그 작성 오류
test진행시 마지막 단계에서 이런 오류 문구가 떠서 강사님과 똑같이 오류수정 진행하는데 해결이 되질 않습니다 ㅠ 혹시 몰라 views.py 와 test.py를 첨부해드리겠습니다. from django.core.exceptions import PermissionDenied from django.shortcuts import render, redirect from django.utils.text import slugify from django.views.generic import ListView, DetailView, CreateView, UpdateView from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin from blog.models import Post, Category, Tag class PostList(ListView): model = Post ordering = '-pk' def get_context_data(self, **kwargs): context = super(PostList, self).get_context_data() context['categories'] = Category.objects.all() context['no_category_post_count'] = Post.objects.filter(category=None).count() return context class PostDetail(DetailView): model = Post def get_context_data(self, **kwargs): context = super(PostDetail, self).get_context_data() context['categories'] = Category.objects.all() context['no_category_post_count'] = Post.objects.filter(category=None).count() return context class PostCreate(LoginRequiredMixin, UserPassesTestMixin,CreateView): # LoginRequiredMixin 로그인이 되어 있는 경우에만 이 페이지 접속 가능하게 model = Post fields = ['title', 'hook_text', 'content', 'head_image', 'file_upload', 'category'] def test_func(self): return self.request.user.is_superuser or self.request.user.is_staff def form_valid(self, form): # 폼에 들어있는 내용이 맞는지 확인하는 기능 current_user = self.request.user if current_user.is_authenticated and (current_user.is_staff or current_user.is_superuser): form.instance.author = current_user # 만들어진 Form에 instance의 author라는 필드를 current_user 로 채워라 response = super(PostCreate, self).form_valid(form) # from_valid() : 양식이 유효한경우 관련 모델을 저장. tags_str = self.request.POST.get('tags_str') if tags_str: tags_str = tags_str.strip() # strip : 문자열 앞뒤에 빈공간 있으면 없애준다. tags_str = tags_str.replace(',', ';') # 문자열 바꿔주기 , > ; tags_list = tags_str.split(';') # for t in tags_list: t = t.strip() tag, is_tag_created = Tag.objects.get_or_create(name=t) # get_or_create(name=t) : 만약, name 이 t인 것을 가져오고, 없으면 그것을 name이 t로 만들어서 가져오기. if is_tag_created: tag.slug = slugify(t, allow_unicode=True) tag.save() self.object.tags.add(tag) return response else: return redirect('/blog/') # 로그인을 하지 않고 해당 페이지를 열려하면 Blog 경로로 날려짐 class PostUpdate(LoginRequiredMixin, UpdateView): model = Post fields = ['title', 'hook_text', 'content', 'head_image', 'file_upload', 'category'] template_name = 'blog/post_update_form.html' def dispatch(self, request, *args, **kwargs): # 디스패치라는것은 url을 get 방식인지 post방식인지 알아내는 방법이지만, 해당 하는 포스트에 권한이 있는 유저인지 검증할 수 있다. if request.user.is_authenticated and request.user == self.get_object().author: return super(PostUpdate, self).dispatch(request, *args, **kwargs) else: raise PermissionDenied # 장고에서 기본으로 제공되는 기능이고, 에러 페이지 대신에 권한이 없다면 권한이 없다는 메시지를 띄어준다 def get_context_data(self, **kwargs): context = super(PostUpdate, self).get_context_data() if self.object.tags.exists(): tags_str_list = list() for t in self.object.tags.all(): tags_str_list.append(t.name) context['tags_str_default'] = '; '.join(tags_str_list) return context def form_valid(self, form): response = super(PostUpdate, self).form_valid(form) self.object.tags.clear() tags_str = self.request.POST.get('tags_str') if tags_str: tags_str = tags_str.strip() # strip : 문자열 앞뒤에 빈공간 있으면 없애준다. tags_str = tags_str.replace(',', ';') # 문자열 바꿔주기 , > ; tags_list = tags_str.split(';') # for t in tags_list: t = t.strip() tag, is_tag_created = Tag.objects.get_or_create(name=t) # get_or_create(name=t) : 만약, name 이 t인 것을 가져오고, 없으면 그것을 name이 t로 만들어서 가져오기. if is_tag_created: tag.slug = slugify(t, allow_unicode=True) tag.save() self.object.tags.add(tag) return response def category_page(request, slug): if slug == 'no_category': category = '미분류' post_list = Post.objects.filter(category=None) else: category = Category.objects.get(slug=slug) post_list = Post.objects.filter(category=category) return render( request, 'blog/post_list.html', { 'post_list': post_list, 'categories': Category.objects.all(), 'no_category_post_count': Post.objects.filter(category=None).count(), 'category': category } ) def tag_page(request, slug): tag = Tag.objects.get(slug=slug) post_list = tag.post_set.all() return render( request, 'blog/post_list.html', { 'post_list': post_list, 'categories': Category.objects.all(), 'no_category_post_count': Post.objects.filter(category=None).count(), 'tag': tag } ) # def single_post_page(request, pk): # reqeust, 변수명 # post = Post.objects.get(pk=pk) # # return render( # request, # 'blog/single_page.html', # { # 'post': post, # } # ) ## 이건 test.py 코드입니다################## from django.test import TestCase, Client # Client 가 하는 역할 : 장고에서 재공하는 것이며 웹사이트의 방문자를 말함? from bs4 import BeautifulSoup from .models import Post, Category, Tag from django.contrib.auth.models import User # 장고에서 기본적으로 제공하는 User 임. class TestView(TestCase): def setUp(self): # DB에 들어갈 내용을 여기서 테스트 적용 self.client = Client() self.user_trump = User.objects.create_user( username='trump', password='somepassword', ) self.user_obama = User.objects.create_user( username='obama', password='somepassword', ) self.user_obama.is_staff = True self.user_obama.save() self.category_programming = Category.objects.create( name='programming', slug='programming' ) self.category_music = Category.objects.create( name='music', slug='music' ) self.tag_python_kor = Tag.objects.create( name='파이썬 공부', slug='파이썬-공부' ) self.tag_python = Tag.objects.create( name='python', slug='python' ) self.tag_hello = Tag.objects.create( name='hello', slug='hello' ) self.post_001 = Post.objects.create( title='첫번째 포스트 입니다.', content='Hello, World. we are the World', category=self.category_programming, author=self.user_trump ) self.post_001.tags.add(self.tag_hello) self.post_002 = Post.objects.create( title='두번째 포스트 입니다.', content='저는 쌀국수를 좋아합니다.', category=self.category_music, author=self.user_obama ) self.post_003 = Post.objects.create( title='세번째 포스트 입니다.', content='Category가 없나유.', author=self.user_obama ) self.post_003.tags.add(self.tag_python) self.post_003.tags.add(self.tag_python_kor) def navbar_test(self, soup): navbar = soup.nav self.assertIn('Blog', navbar.text) self.assertIn('About Me', navbar.text) logo_btn = navbar.find('a', text='Saohwan') self.assertEqual(logo_btn.attrs['href'], '/') home_btn = navbar.find('a', text='Home') self.assertEqual(home_btn.attrs['href'], '/') blog_btn = navbar.find('a', text='Blog') self.assertEqual(blog_btn.attrs['href'], '/blog') about_me_btn = navbar.find('a', text='About Me') self.assertEqual(about_me_btn.attrs['href'], '/about_me') def category_card_test(self, soup): categories_card = soup.find('div', id='categories-card') self.assertIn('Categories', categories_card.text) # 카테고리스라는 문구가 categories_card 에 있는지 확인하는 테스트 self.assertIn( f'{self.category_programming} ({self.category_programming.post_set.count()})', categories_card.text ) self.assertIn( f'{self.category_music} ({self.category_music.post_set.count()})', categories_card.text ) # 이렇게 하는 이유는 유지 보수성을 위해 self.assertIn( f'미분류 ({Post.objects.filter(category=None).count()})', categories_card.text ) def test_post_list_with_posts(self): self.assertEqual(Post.objects.count(), 3) # 시작하자마자 포스트가 3개있다. # 1.1 포스트 목록 페이지 (post list)를 연다. response = self.client.get('/blog/') # 블로그 페이지가서 읽고 # 1.2 정상적으로 페이지가 로드된다. self.assertEqual(response.status_code, 200) # 에러 코드가 200이면 정상임 # 1.3 페이지의 타이틀에 Blog 라는 문구가 있다. soup = BeautifulSoup(response.content, 'html.parser') self.assertIn('Blog', soup.title.text) # soup.title.text에 'blog' 라는 문구가 있어야한다. soup 으로 접근 self.navbar_test(soup) # 블로그라는게 헤더 타이틀에 있는지 확인\ self.category_card_test(soup) # 3.3 메인 영역에 포스트 2개의 타이틀이 존재한다. main_area = soup.find('div', id='main-area') # 3.4 "아직 게시물이 없습니다" 라는 문구가 없어야 한다. self.assertNotIn('아직 게시물이 없습니다.', main_area.text) post_001_card = main_area.find('div', id='post-1') self.assertIn(self.post_001.title, post_001_card.text) self.assertIn(self.post_001.category.name, post_001_card.text) self.assertIn(self.tag_hello.name, post_001_card.text) self.assertNotIn(self.tag_python.name, post_001_card.text) self.assertNotIn(self.tag_python_kor.name, post_001_card.text) post_002_card = main_area.find('div', id='post-2') self.assertIn(self.post_002.title, post_002_card.text) self.assertIn(self.post_002.category.name, post_002_card.text) self.assertNotIn(self.tag_hello.name, post_002_card.text) self.assertNotIn(self.tag_python.name, post_002_card.text) self.assertNotIn(self.tag_python_kor.name, post_002_card.text) post_003_card = main_area.find('div', id='post-3') self.assertIn(self.post_003.title, post_003_card.text) self.assertIn('미분류', post_003_card.text) self.assertNotIn(self.tag_hello.name, post_003_card.text) self.assertIn(self.tag_python.name, post_003_card.text) self.assertIn(self.tag_python_kor.name, post_003_card.text) self.assertIn(self.post_001.author.username.upper(), main_area.text) self.assertIn(self.post_002.author.username.upper(), main_area.text) # upper 대문자로 나왔으면 좋겠을 때. def test_post_list_without_posts(self): Post.objects.all().delete() response = self.client.get('/blog/') self.assertEqual(response.status_code, 200) # 에러 코드가 200이면 정상임 soup = BeautifulSoup(response.content, 'html.parser') self.navbar_test(soup) self.assertIn('Blog', soup.title.text) self.assertEqual(Post.objects.count(), 0) # Post 모델에 레코드가 몇개 있는지 아무 겄도 없을때 main_area = soup.find('div', id='main-area') self.assertIn('아직 게시물이 없습니다.', main_area.text) def test_post_detail(self): self.assertEquals(Post.objects.count(), 3) # 테스트는 생성할때마다 DB가 초기화되서 0이다. # 1.2 그 포스트의 url은 '/blog/1/' 이다. self.assertEquals(self.post_001.get_absolute_url(), '/blog/1/') # 2 첫 번째 포스트의 상세 페이지 테스트 # 2.1 첫 번쨰 포스트의 url로 접근하면 정상적으로 response가 온다..(status code: 200). response = self.client.get(self.post_001.get_absolute_url()) self.assertEqual(response.status_code, 200) soup = BeautifulSoup(response.content, 'html.parser') # 2.2 포스트 목록 페이지와 똑같은 내비게이션 바가 있다. self.navbar_test(soup) self.category_card_test(soup) # 2.3 첫 번째 포스트의 제목이 웹 브라우저 탭 타이틀에 들어 있다. self.assertIn(self.post_001.title, soup.title.text) # 2.4 첫 번째 포스트의 제목이 포스트 영역에 있다. main_area = soup.find('div', id='main-area') post_area = main_area.find('div', id='post-area') self.assertIn(self.post_001.title, post_area.text) self.assertIn(self.post_001.category.name, post_area.text) # 2.5 첫 번째 포스트의 작성자(author)가 포스트 영역에 있다.(아직 구현할 수 없음). self.assertIn(self.user_trump.username.upper(), main_area.text) # 2.6 첫 번째 포스트의 내용(content)이 포스트 영역에 있다. self.assertIn(self.post_001.content, post_area.text) def test_category_page(self): response = self.client.get(self.category_programming.get_absolute_url()) self.assertEqual(response.status_code, 200) soup = BeautifulSoup(response.content, 'html.parser') # html.parser 로 담아준다. self.navbar_test(soup) self.category_card_test(soup) main_area = soup.find('div', id='main-area') self.assertIn(self.category_programming.name, main_area.h1.text) self.assertIn(self.category_programming.name, main_area.text) self.assertIn(self.post_001.title, main_area.text) self.assertNotIn(self.post_002.title, main_area.text) self.assertNotIn(self.post_003.title, main_area.text) def test_tag_page(self): response = self.client.get(self.tag_hello.get_absolute_url()) self.assertEqual(response.status_code, 200) soup = BeautifulSoup(response.content, 'html.parser') self.navbar_test(soup) self.category_card_test(soup) self.assertIn(self.tag_hello.name, soup.h1.text) main_area = soup.find('div', id='main-area') self.assertIn(self.tag_hello.name, main_area.text) self.assertIn(self.post_001.title, main_area.text) self.assertNotIn(self.post_002.title, main_area.text) self.assertNotIn(self.post_003.title, main_area.text) def test_create_post_without_login(self): response = self.client.get('/blog/create_post/') self.assertNotEqual(response.status_code, 200) def test_create_post_with_login(self): self.client.login(username='trump', password='somepassword') response = self.client.get('/blog/create_post/') self.assertNotEqual(response.status_code, 200) self.client.login(username='obama', password='somepassword') response = self.client.get('/blog/create_post/') self.assertEqual(response.status_code, 200) soup = BeautifulSoup(response.content, 'html.parser') self.assertEqual('Create Post - Blog', soup.title.text) main_area = soup.find('div', id='main-area') self.assertIn('Create a New Post', main_area.text) tags_str_input = main_area.find('input', id='id_tags_str') # input 이라는 태그중에서 id가 id_tags_str 이 있는지 확인하는 작업. self.assertTrue(tags_str_input) self.assertEqual(Tag.objects.count(), 3) self.client.post( '/blog/create_post/', { 'title': 'Post Form 만들기', 'content': 'Post Form 페이지를 만듭시다.', 'tags_str': 'new_tag; 한글 태그, python' } ) last_post = Post.objects.last() self.assertEqual(last_post.title, 'Post Form 만들기') self.assertEqual(last_post.author.username, 'obama') self.assertEqual(last_post.content, 'Post Form 페이지를 만듭시다.') self.assertEqual(last_post.tags.count(), 3) self.assertTrue(Tag.objects.get(name='new_tag')) self.assertTrue(Tag.objects.get(name='한글 태그')) self.assertTrue(Tag.objects.get(name='python')) self.assertEqual(Tag.objects.count(), 5) def test_update_post(self): update_post_url = f'/blog/update_post/{self.post_003.pk}/' # 로그인 하지 않은 상태에서 접근 하는 경우 response = self.client.get(update_post_url) self.assertNotEqual(response.status_code, 200) # 로그인은 했지만, 작성자가 아닌 경우 self.assertNotEqual(self.post_003.author, self.user_trump) self.client.login(usernmae='trump', password='somepassword') response = self.client.get(update_post_url) self.assertNotEqual(response.status_code, 200) # 작성자(obama)가 접근하는 경우 self.assertEqual(self.post_003.author, self.user_obama) self.client.login(username='obama', password='somepassword') response = self.client.get(update_post_url) self.assertEqual(response.status_code, 200) soup = BeautifulSoup(response.content, 'html.parser') self.assertEqual('Edit Post - Blog', soup.title.text) main_area = soup.find('div', id='main-area') self.assertIn('Edit Post', main_area.text) tag_str_input = main_area.find('input', id='id_tags_str') self.assertTrue(tag_str_input) self.assertIn('파이썬 공부; python', tag_str_input.attrs['value']) response = self.client.post( update_post_url, { 'title': '세 번째 포스트를 수정했습니다.', 'content': '안녕 세계? 우리는 하나!', 'category': self.category_music.pk, 'tags_str': '파이썬 공부; 한글 태그, some tag' }, follow=True # 위 내용을 리다이렉트 되는 것을 따라가려면 설정 ) soup = BeautifulSoup(response.content, 'html.parser') main_area = soup.find('div', id='main-area') self.assertIn('세 번째 포스트를 수정했습니다.', main_area.text) self.assertIn('안녕 세계? 우리는 하나!', main_area.text) self.assertIn(self.category_music.name, main_area.text) self.assertIn('파이썬 공부', main_area.text) self.assertIn('한글 태그', main_area.text) self.assertIn('some tag', main_area.text) self.assertNotIn('python', main_area.text)
- 미해결Do It! 장고+부트스트랩: 파이썬 웹개발의 정석
tag 모델 만들기 강의에서 오류가났는데 어디서 잘못된건지 모르겠네요
오류가 어디서 잘못된건지 모르겠네요 다시 처음부터하는거 힘든데 하나 하나 풀어나가는데 좋겠는데요 다 고쳐야 하는데요 Watching for file changes with StatReloader Exception in thread django-main-thread: Traceback (most recent call last): File "C:\Program Files\Python310\lib\threading.py", line 1009, in _bootstrap_inner self.run() File "C:\Program Files\Python310\lib\threading.py", line 946, in run self._target(*self._args, **self._kwargs) File "C:\github\-do_it_django_inflearn_2024-\venv\lib\site-packages\django\utils\autoreload.py", line 64, in wrapper fn(*args, **kwargs) File "C:\github\-do_it_django_inflearn_2024-\venv\lib\site-packages\django\core\management\commands\runserver.py", line 110, in inner_run autoreload.raise_last_exception() File "C:\github\-do_it_django_inflearn_2024-\venv\lib\site-packages\django\utils\autoreload.py", line 87, in raise_last_exception raise _exception[1] File "C:\github\-do_it_django_inflearn_2024-\venv\lib\site-packages\django\core\management\__init__.py", line 375, in execute autoreload.check_errors(django.setup)() File "C:\github\-do_it_django_inflearn_2024-\venv\lib\site-packages\django\utils\autoreload.py", line 64, in wrapper fn(*args, **kwargs) File "C:\github\-do_it_django_inflearn_2024-\venv\lib\site-packages\django\__init__.py", line 24, in setup apps.populate(settings.INSTALLED_APPS) File "C:\github\-do_it_django_inflearn_2024-\venv\lib\site-packages\django\apps\registry.py", line 122, in populate app_config.ready() File "C:\github\-do_it_django_inflearn_2024-\venv\lib\site-packages\django\contrib\admin\apps.py", line 27, in ready self.module.autodiscover() File "C:\github\-do_it_django_inflearn_2024-\venv\lib\site-packages\django\contrib\admin\__init__.py", line 24, in autodiscover autodiscover_modules('admin', register_to=site) File "C:\github\-do_it_django_inflearn_2024-\venv\lib\site-packages\django\utils\module_loading.py", line 47, in autodiscover_modules import_module('%s.%s' % (app_config.name, module_to_search)) File "C:\Program Files\Python310\lib\importlib\__init__.py", line 126, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1050, in _gcd_import File "<frozen importlib._bootstrap>", line 1027, in _find_and_load File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 688, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 883, in exec_module File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed File "C:\github\-do_it_django_inflearn_2024-\blog\admin.py", line 2, in <module> from .models import Post, Category ImportError: cannot import name 'Post' from 'blog.models' (C:\github\-do_it_django_inflearn_2024-\blog\models.py)
- 미해결Do It! 장고+부트스트랩: 파이썬 웹개발의 정석
띄어쓰기 없이 했는데도 계속 오류가 나요 ~
(사진)
- 미해결Do It! 장고+부트스트랩: 파이썬 웹개발의 정석
gunicorn을 깔았는데 자꾸 not found래요...
(사진)
- 미해결Do It! 장고+부트스트랩: 파이썬 웹개발의 정석
질문 이어서합니다.upstream을 찾을 수 없다고 떠서요..ㅠㅠ
(사진)
- 미해결Do It! 장고+부트스트랩: 파이썬 웹개발의 정석
upstream 옆에 do_it_django로만 써야하나요?
(사진)
- 미해결Do It! 장고+부트스트랩: 파이썬 웹개발의 정석
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' 추가
계속 경고가 뜨길래 구글링해서 setting.py에다가 DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'를 추가했더니 경고가 안나와요. 이렇게 하는게 맞나요?
- 미해결Do It! 장고+부트스트랩: 파이썬 웹개발의 정석
AssertionError
이 부분이 에러가 나는데 어떻게 풀지를 모르겠네요..ㅠㅠ
- 미해결Do It! 장고+부트스트랩: 파이썬 웹개발의 정석
안녕하세요 첫 질문이네요
정적파일 관리하기 - 블로그 포스트 상세 페이지에 부트스트랩 적용하기 이 강의에서요 잘안되네요 post_list.html 에서 코드 분명히 또같이 했는데요 <!DOCTYPE html>{% load static %}<html> <head> <title>Blog | 가을이네 사이트</title> <link href="{% static 'blog/bootstrap/bootstrap.min.css'%}" rel="stylesheet" type="text/css"> <!-- <link href="./practice.css" rel="stylesheet" type="text/css"> --> <script src="https://kit.fontawesome.com/0ea9e3384c.js" crossorigin="anonymous"></script> </head> <body> <nav class="navbar navbar-expand-lg navbar-light bg-light"> <div class="container"> <a class="navbar-brand" href="./index.html">Do It Django</a> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavDropdown" aria-controls="navbarNavDropdown" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarNavDropdown"> <ul class="navbar-nav"> <li class="nav-item active"> <a class="nav-link" href="./index.html">Home</a> </li> <li class="nav-item"> <a class="nav-link" href="./blog_list.html">Blog</a> </li> <li class="nav-item"> <a class="nav-link" href="./about_me.html">About me</a> </li> <li class="nav-item dropdown"> <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> Dropdown link </a> <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink"> <a class="dropdown-item" href="#">Action</a> <a class="dropdown-item" href="#">Another action</a> <a class="dropdown-item" href="#">Something else here</a> </div> </li> </ul> <ul class="navbar-nav ml-auto"> <li class="nav-item"> <a class="nav-link" href="#" data-toggle="modal" data-target="#loginModal"><i class="fas fa-sign-in-alt"></i> Log In</a> </li> </ul> </div> </div> </nav> <!-- Modal --><div class="modal fade" id="loginModal" tabindex="-1" aria-labelledby="loginModalLabel"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title" id="loginModalLabel"><i class="fas fa-sign-in-alt"></i> Log In</h5> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true">×</span> </button> </div> <div class="modal-body"> <div class="row"> </div> <div class="col-md-6 col-sm-12"> <button type="button" class="btn btn-outline-dark btn-block btn-sm">Sign up with E-mail</button> </div> <div class="col-md-6 col-sm-12"> <button type="button" class="btn btn-outline-dark btn-block btn-sm"><i class="fab fa-google"></i> Log in with Google</button> <button type="button" class="btn btn-outline-dark btn-block btn-sm">Log in with username</button> </div> </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button> </div> </div> </div></div> <div class="container"> <div class="row my-3"> <div class="col-md-8 col-lg-9"> <h1>Blog</h1> {% for p in post_list %} <!-- Blog Post --> <div class="card mb-4"> <img class="card-img-top" src="http://placehold.it/750x300" alt="Card image cap"> <div class="card-body"> <h2 class="card-title">{{p.title}}</h2> <p class="card-text">{{ p.content }}</p> <a href="{{ p.get_absolute_url }}" class="btn btn-primary">Read More →</a> </div> <div class="card-footer text-muted"> Posted on January 1, 2020 by <a href="#">작성자명 쓸 위치(개발예정)</a> </div> </div> {% endfor %} <!-- Pagination --> <ul class="pagination justify-content-center mb-4"> <li class="page-item"> <a class="page-link" href="#">← Older</a> </li> <li class="page-item disabled"> <a class="page-link" href="#">Newer →</a> </li> </ul> </div> <div class="col-md-4 col-lg-3"> <!-- Search Widget --> <div class="card my-4"> <h5 class="card-header">Search</h5> <div class="card-body"> <div class="input-group"> <input type="text" class="form-control" placeholder="Search for..."> <span class="input-group-append"> <button class="btn btn-secondary" type="button">Go!</button> </span> </div> </div> </div> <!-- Categories Widget --> <div class="card my-4"> <h5 class="card-header">Categories</h5> <div class="card-body"> <div class="row"> <div class="col-lg-6"> <ul class="list-unstyled mb-0"> <li> <a href="#">Web Design</a> </li> <li> <a href="#">HTML</a> </li> <li> <a href="#">Freebies</a> </li> </ul> </div> <div class="col-lg-6"> <ul class="list-unstyled mb-0"> <li> <a href="#">JavaScript</a> </li> <li> <a href="#">CSS</a> </li> <li> <a href="#">Tutorials</a> </li> </ul> </div> </div> </div> </div> </div> </div> </div> <!-- Footer --> <footer class="py-5 bg-dark"> <div class="container"> <p class="m-0 text-center text-white">Copyright © Your Website 2021</p> </div> <!-- /.container --> </footer> <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/js/bootstrap.bundle.min.js" integrity="sha384-Piv4xVNRyMGpqkS2by6br4gNJ7DXjqk09RmUpJ8jgGtD7zP9yug3goQfGII0yAns" crossorigin="anonymous"></script> </body></html> 여기서 똑같이 했는데 댓글쓰기 변화가 없네요 아무리 해도 안되네요 다음 코드 post_datail.html <!DOCTYPE html>{% load static %}<html lang="ko"><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <meta name="description" content=""> <meta name="author" content=""> <title>Blog Home - Start Bootstrap Template</title> <!-- Bootstrap core CSS --> <link href="{% static 'blog/bootstrap/bootstrap.min.css'%}" rel="stylesheet" type="text/css"> <!-- Custom styles for this template --> <link href="css/blog-home.css" rel="stylesheet"></head><body> <!-- Navigation --> <nav class="navbar navbar-expand-lg navbar-dark bg-dark fixed-top"> <div class="container"> <a class="navbar-brand" href="#">Start Bootstrap</a> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarResponsive" aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarResponsive"> <ul class="navbar-nav ml-auto"> <li class="nav-item active"> <a class="nav-link" href="#">Home <span class="sr-only">(current)</span> </a> </li> <li class="nav-item"> <a class="nav-link" href="#">About</a> </li> <li class="nav-item"> <a class="nav-link" href="#">Services</a> </li> <li class="nav-item"> <a class="nav-link" href="#">Contact</a> </li> </ul> </div> </div> </nav> <!-- Page Content --> <div class="container"> <div class="row"> <!-- Blog Entries Column --> <div class="col-md-8"> <h1 class="my-4">Page Heading <small>Secondary Text</small> </h1> <!-- Blog Post --> <div class="card mb-4"> <img class="card-img-top" src="http://placehold.it/750x300" alt="Card image cap"> <div class="card-body"> <h2 class="card-title">Post Title</h2> <p class="card-text">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Reiciendis aliquid atque, nulla? Quos cum ex quis soluta, a laboriosam. Dicta expedita corporis animi vero voluptate voluptatibus possimus, veniam magni quis!</p> <a href="#" class="btn btn-primary">Read More →</a> </div> <div class="card-footer text-muted"> Posted on January 1, 2020 by <a href="#">Start Bootstrap</a> </div> </div> <!-- Blog Post --> <div class="card mb-4"> <img class="card-img-top" src="http://placehold.it/750x300" alt="Card image cap"> <div class="card-body"> <h2 class="card-title">Post Title</h2> <p class="card-text">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Reiciendis aliquid atque, nulla? Quos cum ex quis soluta, a laboriosam. Dicta expedita corporis animi vero voluptate voluptatibus possimus, veniam magni quis!</p> <a href="#" class="btn btn-primary">Read More →</a> </div> <div class="card-footer text-muted"> Posted on January 1, 2020 by <a href="#">Start Bootstrap</a> </div> </div> <!-- Blog Post --> <div class="card mb-4"> <img class="card-img-top" src="http://placehold.it/750x300" alt="Card image cap"> <div class="card-body"> <h2 class="card-title">Post Title</h2> <p class="card-text">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Reiciendis aliquid atque, nulla? Quos cum ex quis soluta, a laboriosam. Dicta expedita corporis animi vero voluptate voluptatibus possimus, veniam magni quis!</p> <a href="#" class="btn btn-primary">Read More →</a> </div> <div class="card-footer text-muted"> Posted on January 1, 2020 by <a href="#">Start Bootstrap</a> </div> </div> <!-- Pagination --> <ul class="pagination justify-content-center mb-4"> <li class="page-item"> <a class="page-link" href="#">← Older</a> </li> <li class="page-item disabled"> <a class="page-link" href="#">Newer →</a> </li> </ul> </div> <!-- Sidebar Widgets Column --> <div class="col-md-4"> <!-- Search Widget --> <div class="card my-4"> <h5 class="card-header">Search</h5> <div class="card-body"> <div class="input-group"> <input type="text" class="form-control" placeholder="Search for..."> <span class="input-group-append"> <button class="btn btn-secondary" type="button">Go!</button> </span> </div> </div> </div> <!-- Categories Widget --> <div class="card my-4"> <h5 class="card-header">Categories</h5> <div class="card-body"> <div class="row"> <div class="col-lg-6"> <ul class="list-unstyled mb-0"> <li> <a href="#">Web Design</a> </li> <li> <a href="#">HTML</a> </li> <li> <a href="#">Freebies</a> </li> </ul> </div> <div class="col-lg-6"> <ul class="list-unstyled mb-0"> <li> <a href="#">JavaScript</a> </li> <li> <a href="#">CSS</a> </li> <li> <a href="#">Tutorials</a> </li> </ul> </div> </div> </div> </div> <!-- Side Widget --> <div class="card my-4"> <h5 class="card-header">Side Widget</h5> <div class="card-body"> You can put anything you want inside of these side widgets. They are easy to use, and feature the new Bootstrap 4 card containers! </div> </div> </div> </div> <!-- /.row --> </div> <!-- /.container --> <!-- Footer --> <footer class="py-5 bg-dark"> <div class="container"> <p class="m-0 text-center text-white">Copyright © Your Website 2020</p> </div> <!-- /.container --> </footer> <!-- Bootstrap core JavaScript --> <script src="vendor/jquery/jquery.min.js"></script> <script src="vendor/bootstrap/js/bootstrap.bundle.min.js"></script></body></html>
- 미해결Do It! 장고+부트스트랩: 파이썬 웹개발의 정석
강의 순서가
강의 순서가 위강의랑 아래 강의 바뀌어서 살짝 당황했습니다 ㅎㅎ
- 미해결Do It! 장고+부트스트랩: 파이썬 웹개발의 정석
tag 수정기능구현시 오류
안녕하세요 교재구입후에 강의 들으며 진행중에 있는 학생입니다. p424 의 오류발생하여 425 페이지의 코드로 수정했고 Cmder 자체에는 ok가 나왔습니다. 그런데 서버에서 태그 입력란에 쓰고 써밋시 오류가 발생합니다. Failed to load resource: the server responded with a status of 500 (Internal Server Error) ㅠㅠ 정말 하루종일 씨름했습니다..... 도와주세요
- 미해결Do It! 장고+부트스트랩: 파이썬 웹개발의 정석
static/blog/css/ 폴더에 css파일을 넣었는데 실행이 안됩니다
css파일을 넣고 실행시키면 콘솔창에 아래와 같은 오류메시지가 나오는데 해결방법 문의드립니다 127.0.0.1/:1 Refused to apply style from 'http://127.0.0.1:8000/blog/1/%%20static%20'blog/css/blog-home.css'%20%' because its MIME type ('text/html') is not a supported stylesheet MIME type, and strict MIME checking is enabled.
- 미해결Do It! 장고+부트스트랩: 파이썬 웹개발의 정석
css파일을 static 폴더 않에 넣었는데 오류가 발생하네요~~ 어떻게 해결하는지요
static/blog/css/blog-home.css 파일을 만들어주고 실행하면 콘솔에 아래와 같이 에러가 쓰는데 해결방법 문의드립니다 Refused to apply style from 'http://127.0.0.1:8000/blog/1/%%20static%20'blog/css/blog-home.css'%20%' because its MIME type ('text/html') is not a supported stylesheet MIME type, and strict MIME checking is enabled.
- 미해결Do It! 장고+부트스트랩: 파이썬 웹개발의 정석
blog폴더에 views.py에 class PostList(Listview) 내용과 post_list.html에 변수명이 틀린거에 대한 의문
view.py 에서 model = Post를 대입한 부분은 이해가 가는데 post_list.html에서 포문을 돌릴때 post_list라고 하는거는 변수명이 안맞는데 잘 돌아가는거에 대한 의문점이 듭니다.
- 해결됨Do It! 장고+부트스트랩: 파이썬 웹개발의 정석
StartBootstrap
StartBootstrap 버전이 업데이트되서 현재 강의 처럼 따라하면 업데이트 버전과 코드가 달라서 현재 강좌에서 원하는 결과물과 맞지 않은 점이 있는데 이부분 한번 확인해주시겠나요?
- 미해결Do It! 장고+부트스트랩: 파이썬 웹개발의 정석
맥쓰는 사람도 좀 ㅋㅋㅋ
명령어가 달라서 틀린거 나올때마다 검색해야 하는 불편함이 있네요 ㅠ