[0531] 타임어택 리트

nikevapormax·2022년 5월 31일
0

TIL

목록 보기
34/116
post-custom-banner

🤯 django time attack

1번) blog app 생성

  • 아래의 명령어를 terminal에 입력해 앱 생성
$ django-admin startapp blog
  • 프로젝트 탐색기에 blog 앱이 생긴 것을 확인
  • timeattack_retry_0531/settings.py에서 생성된 앱 등록
INSTALLED_APPS = [
    # 내가 만든 app
    'blog',
    
    
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

2, 3, 4번) model 생성

  • blog 앱 안에 모델을 생성할 것이므로 blog/models.py에서 모델 생성
from django.db import models


class Category(models.Model):
    class Meta:
        db_table = 'category'

    # 카테고리 이름, 설명
    name = models.CharField(max_length=50)
    desc = models.TextField()


class Article(models.Model):
    class Meta:
        db_table = 'article'

    # 글 제목, 글 카테고리, 글 내용
    title = models.CharField(max_length=20)
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    content = models.TextField()
  • 이제 해당 모델을 같은 앱 폴더 안에 있는 blog/admin.py에 입력
from django.contrib import admin
from .models import Category, Article

# Register your models here.
admin.site.register(Category)
admin.site.register(Article)
  • db에서 해당 모델들을 사용하기 위해 migrate 절차 진행
  • 아래의 코드를 terminal에서 입력
$ python manage.py makemigrations
$ python manage.py migrate
  • 그리고 db를 세팅해야 함(파이참은 오른쪽 데이터베이스 창에서 가능)

5번) admin 페이지에서 카테고리 생성

  • admin 페이지를 사용하려면 먼저 super user를 생성해야 함
  • termianl에서 아래의 코드를 입력하고, 가입 절차를 거치면 됨
    • 만약 비밀번호 에러나면 쿨하게 하나 더 만드셈 ㅋ 시간낭비하지말고
  • 이번에 다시 시도하면서 경험한 점인데, db를 migrate하지 않고 슈퍼유저를 만들게 되면 엄청난 양의 에러를 대면하게 됨
$ python manage.py createsuperuser 
  • 그 다음에 http://127.0.0.1:8000/admin/로 가서 로그인 진행
  • 그리고 카테고리의 add를 눌러 카테고리를 생성해주면 됨

6번 이후

  • timeattack_retry_0531/urls.py
from django.contrib import admin
from django.urls import path, include


urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('blog.urls'))
]
  • blog/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('', views.category_view, name="category"),
    path('new/', views.new_view, name="new"),
    path('detail/<int:id>', views.detail_view, name="detail"),
    path('<str:name>', views.article_view, name="article"),
]
  • blog/views.py
from django.shortcuts import render, redirect
from .models import Category, Article


# Create your views here.
def new_view(request):
    # GET
    if request.method == 'GET':
        categories = Category.objects.all()
        return render(request, 'new.html', {'categories': categories})
    # POST
    elif request.method == 'POST':
        # 사용자가 입력한 3 가지 값
        title = request.POST.get('title', '')
        category = request.POST.get('category', '')
        content = request.POST.get('content', '')

        categories = Category.objects.all()

        if title == '' or category == '' or content == '':
            return render(request, 'new.html', {'error': '값을 제대로 입력해주세요!', 'categories': categories})
        else:
            category = Category.objects.get(name=category)
            article = Article.objects.create(title=title, category=category, content=content)

            # 자, 저장은 잘 됐어. 그런데 사용자가 디테일 페이지에 들어가면 어떻게 빼줄래???
            # 나는 그럼 article의 pk를 사용할게~~
            return redirect('detail', article.id)

# 제일 첫 화면에 각 카테고리별 개수도 보여주고 각 카테고리별 article 페이지로 넘어갈 수 있게 해주는 곳
def category_view(request):
    categories = Category.objects.all()
    infos = {}
    for category in categories:
        infos[category] = Article.objects.filter(category=category).count()
    return render(request, 'category.html', {'infos': infos})

# 해당 카테고리별 게시글들을 볼 수 있는 곳
def article_view(request, name):
    category = Category.objects.get(name=name)
    articles = Article.objects.filter(category=category)
    return render(request, 'article.html', {'articles': articles})

# pk에 해당되는 글을 보여주는 곳
def detail_view(request, id):
    article = Article.objects.get(id=id)
    return render(request, 'detail.html', {'article': article})
  • templates/new.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>New</title>
</head>
<body>
    <form>
        {% csrf_token %}
        <!-- 에러 메세지를 보여줄 수 있도록 해주는 조건문 -->
        {% if error %}
            <div class="alert alert-danger" role="alert" style="color: red;">
                {{ error }}
            </div>
        {% endif %}
        <div>
            <input name="title" placeholder="제목을 입력하세요.">
        </div>
        <select name="category">
            <!-- categories의 값을 가져왔어. 근데 지금 오브젝트값이야.-->
            {% for cate in categories %}
                <option>{{ cate.name }}</option>
            {% endfor %}
        </select>
        <div>
            <input name="content" placeholder="내용을 입력하세요.">
        </div>
        <button type="submit">등록하기</button>
    </form>
</body>
</html>
  • templates/category.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Category</title>
</head>
<body>
    {% for name, count in infos.items %}
        <a href="{% url "article" name %}">{{ name }} ({{ count }})</a>
    {%  endfor %}
    <a href="{% url "new" %}">글쓰기</a>
</body>
</html>
  • templates/article.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Article</title>
</head>
<body>
    {% for article in articles %}
        <a href="{% url "detail" article.pk %}">{{ article.title }}</a>
    {% endfor %}
</body>
</html>
  • templates/detail.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Detail</title>
</head>
<body>
    <h1>{{ article.title }}</h1>
    <p>{{ article.content }}</p>
    <p>[ {{ article.category.name }} ]</p>
    <a href="{% url 'category' %}">목록으로</a>
</body>
</html>
profile
https://github.com/nikevapormax
post-custom-banner

0개의 댓글