슈코딩

[Django] 5/31 아침퀴즈 복습 본문

코딩공부/Django

[Django] 5/31 아침퀴즈 복습

Roshu 2022. 6. 1. 22:36

 

 

퀴즈 내용 제한시간 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.pyurls.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.pyurls.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분안에 기본적인 기능들을 만들 수 있게 될거라 믿고있다.

열심히 타임어택 준비해주신 튜터님 감사합니다. 너무 유익한 타임어택 이었습니다. 

Comments