슈코딩
[Django] 5/31 아침퀴즈 복습 본문
퀴즈 내용 제한시간 1시간 (권장 30분내)
1. Django 프로젝트를 생성하고, blog 라는 앱을 만들어서 settings.py 에 등록해보세요.
- 장고 프로젝트를 생성하고, 터미널에 django-admin startapp blog 를 입력하면 생성된다.
- settings.py 에 blog 추가
2.models.py 에 <글제목, 글 카테고리, 글 내용> 이 들어갈 수 있는 Article 이라는 모델을 만들어보세요.
3.models.py에 <카테고리 이름, 설명> 이 들어갈 수 있는 Category 라는 모델을 만들어 보세요.
4.Article 모델의 글 카테고리에는, Category 모델에 존재하는 카테고리만 들어갈 수 있도록 만들어보세요.
(힌트: Foreign Key)
-내가 적은 답-
from django.db import models
class Category(models.Model):
category_name = models.CharField(max_length=256)
description = models.TextField()
class Article(models.Model):
title = models.CharField(max_length=256)
content = models.TextField()
category = models.ForeignKey(Category, on_delete=models.CASCADE)
-정답 코드-
from django.db import models
# Create your models here.
class Category(models.Model):
name = models.CharField(max_length=256)
description = models.TextField()
class Article(models.Model):
title = models.CharField(max_length=256)
content = models.TextField()
# category 에 들어가는건 글도 아니고, 숫자도 아니고, 리스트도 아니고...
# Category object 가 들어가야만한다
category = models.ForeignKey(Category, on_delete=models.CASCADE)
2번, 3번, 4번 문항은 동일하게 작성을 했다. 그리고 모델을 생성했으니 터미널에
python manage.py makemigrations , python manage.py migrate 를 입력하고 다음문항으로 넘어갔다.
5. Admin 페이지를 통해서, Category 모델에 ‘영화’, ‘드라마’, ‘예능’ 이라는 카테고리를 각각 생성해보세요.
- admin 페이지에 접속하기위한 슈퍼계정을 생성 python manage.py createsuperuser
from django.contrib import admin
from .models import Article, Category
# Register your models here.
admin.site.register(Article)
admin.site.register(Category)
- admin.py에 작성후 admin 페이지 접속 127.0.0.1:8000/admin
- Category 모델 선택후 각각 카테고리 생성.
6. 새 글을 작성할 수 있도록, templates 폴더 안에 form 태그가 존재하는 new.html을 만들고, views.py 과 urls.py에 적절한 코드를 작성해보세요.
- 여기부터는 작성을 해보려했으나, new.html안에 들어가야할 구조 및 템플릿문법이 익숙치 않아서 빠진게 많았다.
-정답-
new.html 파일
<form method="POST">
{# cross site request forgery -> 해킹 공격의 일종, 요청을 만들어서 실제 요청인것마냥 보내는것, 글을 100만개 쓰여지도록 요청을 만들 수도 있음 #}
{% csrf_token %}
<input name="title">
<input name="content">
<select name="category">
{% for category in categories %}
<option value="{{ category.name }}">{{ category.name }}</option>
{% endfor %}
</select>
<button type="submit">글쓰기</button>
</form>
view.py 파일
def new_view(request):
# get 요청으로 들어오면 form 태그 있는 html 을 보여주고
# post 요청이 들어오면 request.POST 변수들 받아서 글 생성
if request.method == 'POST':
title = request.POST.get('title', None)
content = request.POST.get('content', None)
# '영화'라는 카테고리로 글을 썼다면 category_name 에는 '영화'가 할당될것
category_name = request.POST.get('category', None)
# 아래 코드에서 category_name 도 '영화'
category = Category.objects.get(name=category_name)
article = Article.objects.create(title=title, content=content, category=category)
# django 는 자동으로 PK 라는 필드를 만들어준다
# 첫번째 글을 썼다 -> pk = 1
# 두번째 글을 썼다 -> pk = 2
return redirect('detail', article.pk)
elif request.method == 'GET':
# 새 글을 쓸때 현재 category 모델에 존재하는 것만 사용자가 선택할 수 있어야함
categories = Category.objects.all()
return render(request, 'new.html', {'categories':categories})
urls.py 파일
path('new', views.new_view, name='new'), 추가
7. 카테고리 목록을 볼 수 있도록, templates 폴더 안에 카테고리 이름을 리스팅하는 category.html 을 만들고, views.py 과 urls.py 에 적절한 코드를 작성해보세요.
- 7번부터 마지막까지는 아직 장고에 대한 이해도가 강의를 보고 따라 칠 수준이라서 ,
조금만 응용하려해도 시도조차 하지 못했다. 튜터님 해설영상을 보면서 반복 연습을 해야 될것같다.
-정답-
category.html 파일
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{# movie: 1, drama: 0 #}
{% for name, count in infos.items %}
<a href="{% url 'article' name %}">{{ name }}({{ count }})</a>
{% endfor %}
<a href="{% url 'new' %}">글쓰기</a>
</body>
</html>
views.py 파일
# 카테고리 이름, 해당 카테고리 글 개수
# {movie: 1, drama: 0, entertain: 0}
def category_view(request):
categories = Category.objects.all()
infos = {}
for category in categories:
infos[category.name] = Article.objects.filter(category=category).count()
return render(request, 'category.html', {'infos': infos})
urls.py 파일
path('', views.category_view, name='category'), 추가
8. 작성된 글 목록을 볼 수 있도록, templates 폴더 안에 글 제목을 리스팅하는 article.html을 만들고, 사용자가 category.html 에서 클릭한 카테고리에 해당하는 글만 필터링하여 보여주도록 views.py 과 urls.py 에 적절한 코드를 작성해보세요.
-정답-
article.html 파일
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{% for article in articles %}
<a href="{% url 'detail' article.pk %}">{{ article.title }}</a>
{% endfor %}
</body>
</html>
views.py 파일
# '127.0.0.1/movie' -> name='movie'
def article_view(request, name):
category = Category.objects.get(name=name)
articles = Article.objects.filter(category=category)
return render(request, 'article.html', {'articles': articles})
urls.py 파일
path('detail/<int:pk>', views.detail_view, name='detail'), 추가
# detail_view 라는 함수가 PK 라는 변수를 받아서 실행될 수 있게 된다.
9. 특정한 글의 내용을 볼 수 있도록, templates 폴더 안에 글의 제목과 내용을 보여주는 detail.html 을 만들고, 사용자가 article.html 에서 클릭한 글에 해당하는 제목과 내용을 보여주도록 views.py 와 urls.py 에 적절한 코드를 작성해보세요.
-정답-
detail.html 파일
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>{{ article.title }}</h1>
<p>{{ article.content }}</p>
<p>{{ article.category.name }}</p>
<a href="{% url 'category' %}">목록으로</a>
</body>
</html>
views.py 파일
# '127.0.0.1/detail/1' -> pk = 1
def detail_view(request, pk):
article = Article.objects.get(pk=pk) # pk=1
return render(request, 'detail.html', {'article': article})
urls.py 파일
path('<str:name>', views.article_view, name='article'), 추가
# article_view 라는 함수가 NAME 이라는 변수를 받아서 실행될 수 있게됩니다.
10. (심화) category.html 에서 카테고리 목록을 보여줄 때, 카테고리 별 글의 개수까지 함께 보여줄 수 있도록 코드를 수정해보세요.
-정답-
category.html 파일
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{# movie: 1, drama: 0 #}
{% for name, count in infos.items %}
<a href="{% url 'article' name %}">{{ name }}({{ count }})</a> 템플릿 문법을 이용
{% endfor %}
<a href="{% url 'new' %}">글쓰기</a>
</body>
</html>
#1 내가 만든 카테고리 이름으로 url 을 접근할 수 있음 (docu 카테고리의 경우, admin 페이지에서 즉석으로 만들었고, 이후에 따로 urls.py 를 편집해주지 않았음에도 해당 페이지로 접근이 됨)
#2 admin 페이지에서 새 카테고리를 만들자마자, 카테고리 페이지에서 해당 카테고리에 해당하는 글의 개수와 카테고리 이름을 볼 수 있음
느낀점 : 비록 요구사항을 모두 풀 수는 없었지만, 장고를 시작한지 1주일 밖에 안되었고 앞으로 성장하면 충분히 30분안에 기본적인 기능들을 만들 수 있게 될거라 믿고있다.
열심히 타임어택 준비해주신 튜터님 감사합니다. 너무 유익한 타임어택 이었습니다.
'코딩공부 > Django' 카테고리의 다른 글
[Django] DRF 특강 1일차 (0) | 2022.06.15 |
---|---|
[Django] 장고 템플릿(Template) 문법 (0) | 2022.06.02 |
[Django] Data Base & Django ORM & DB관계 (0) | 2022.06.01 |
[Django] Admin 페이지 (0) | 2022.05.31 |
[Django] 파이참 프로젝트 기초 구조 (0) | 2022.05.31 |