>백엔드 개발 >파이썬 튜토리얼 >Django 및 HTMX를 사용하여 To-Do 앱 만들기 - TDD를 사용하여 Todo 모델 추가 부분

Django 및 HTMX를 사용하여 To-Do 앱 만들기 - TDD를 사용하여 Todo 모델 추가 부분

Mary-Kate Olsen
Mary-Kate Olsen원래의
2025-01-04 07:05:34508검색

이것은 HTMX와 Django를 사용하여 Todo 앱을 구축하는 방법에 대한 시리즈의 두 번째 게시물입니다. 1부를 보려면 여기를 클릭하세요.

2부에서는 Todo 모델을 생성하고 단위 테스트를 통해 기본 기능을 구현해 보겠습니다.

Todo 모델 만들기

models.py에서 기본 속성을 사용하여 Todo 모델을 생성해 보겠습니다. 우리는 사용자가 자신의 항목만 볼 수 있도록 Todo 항목을 UserProfile에 연결하려고 합니다. 할 일 항목에는 제목과 부울 속성 is_completed도 있습니다. 우리는 작업을 완료 또는 시작하지 않은 것 외에 "진행 중"으로 설정하는 기능, 기한 등 Todo 모델에 대한 많은 미래 아이디어를 가지고 있지만 이는 나중을 위한 것입니다. 이제 최대한 빨리 화면에 무언가를 표시하는 방법을 간단하게 만들어 보겠습니다.

참고: 실제 앱에서는 UUID를 UserProfile 및 Todo 모델의 기본 키로 사용하는 것을 고려해야 하지만 지금은 간단하게 설명하겠습니다.

# core/models.py

from django.contrib.auth.models import AbstractUser
from django.db import models  # <-- NEW

class UserProfile(AbstractUser):
    pass

# NEW
class Todo(models.Model):
    title = models.CharField(max_length=255)
    is_completed = models.BooleanField(default=False)
    user = models.ForeignKey(
        UserProfile,
        related_name="todos",
        on_delete=models.CASCADE,
    )
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.title

새 모델에 대한 마이그레이션을 실행해 보겠습니다.

❯ uv run python manage.py makemigrations
Migrations for 'core':
  core/migrations/0002_todo.py
    + Create model Todo
❯ uv run python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, core, sessions
Running migrations:
  Applying core.0002_todo... OK

첫 번째 테스트 작성

우리 프로젝트의 첫 번째 테스트를 작성해 보겠습니다. 우리는 사용자가 자신의 할 일 항목만 볼 수 있고 다른 사용자의 항목은 볼 수 없도록 하고 싶습니다.

테스트 작성을 돕기 위해 우리는 더미 Django 모델 인스턴스 생성 프로세스를 단순화하는 model-bakery 프로젝트에 새로운 개발 종속성을 추가할 것입니다. pytest-django도 추가하겠습니다.

❯ uv add model-bakery pytest-django --dev
Resolved 27 packages in 425ms
Installed 2 packagez in 12ms
 + model-bakery==1.20.0
 + pytest-django==4.9.0

pyproject.toml에서 파일 끝에 몇 줄을 추가하여 pytest를 구성해야 합니다.

# pyproject.toml

# NEW
[tool.pytest.ini_options]
DJANGO_SETTINGS_MODULE = "todomx.settings"
python_files = ["test_*.py", "*_test.py", "testing/python/*.py"]

이제 사용자가 자신의 할일에만 액세스할 수 있도록 하는 첫 번째 테스트를 작성해 보겠습니다.

# core/tests/test_todo_model.py

import pytest


@pytest.mark.django_db
class TestTodoModel:
    def test_todo_items_are_associated_to_users(self, make_todo, make_user):
        [user1, user2] = make_user(_quantity=2)

        for i in range(3):
            make_todo(user=user1, title=f"user1 todo {i}")

        make_todo(user=user2, title="user2 todo")

        assert {todo.title for todo in user1.todos.all()} == {
            "user1 todo 0",
            "user1 todo 1",
            "user1 todo 2",
        }

        assert {todo.title for todo in user2.todos.all()} == {"user2 todo"}

우리는 테스트에 사용할 모든 픽스쳐를 위한 장소를 확보하기 위해 pytest의 conftest.py 파일을 사용하고 있습니다. model_bakery 라이브러리를 사용하면 최소한의 상용구로 UserProfile 및 Todo의 인스턴스를 간단하게 생성할 수 있습니다.

#core/tests/conftest.py

import pytest
from model_bakery import baker


@pytest.fixture
def make_user(django_user_model):
    def _make_user(**kwargs):
        return baker.make("core.UserProfile", **kwargs)

    return _make_user


@pytest.fixture
def make_todo(make_user):
    def _make_todo(user=None, **kwargs):
        return baker.make("core.Todo", user=user or make_user(), **kwargs)

    return _make_todo

테스트를 진행해 보세요!

❯ uv run pytest
Test session starts (platform: darwin, Python 3.12.8, pytest 8.3.4, pytest-sugar 1.0.0)
django: version: 5.1.4, settings: todomx.settings (from ini)
configfile: pyproject.toml
plugins: sugar-1.0.0, django-4.9.0
collected 1 item

 core/tests/test_todo_model.py ✓                                                                                                                                   100% ██████████

Results (0.25s):
       1 passed

Todos의 관리자 페이지 등록

마지막으로 관리자 페이지를 등록할 수 있습니다.

# core/admin.py

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import Todo, UserProfile # <-- NEW

# .. previous code

# NEW
@admin.register(Todo)
class TodoAdmin(admin.ModelAdmin):
    model = Todo
    list_display = ["title", "is_completed", "user"]
    list_filter = ["is_completed"]
    search_fields = ["title"]
    list_per_page = 10
    ordering = ["title"]

이제 관리자에서 일부 Todo를 추가할 수 있습니다!

Creating a To-Do app with Django and HTMX - Part Adding the Todo model with TDD

2부가 끝날 때까지 전체 코드를 확인하고 싶다면 Github 02부 브랜치에서 확인하실 수 있습니다.

위 내용은 Django 및 HTMX를 사용하여 To-Do 앱 만들기 - TDD를 사용하여 Todo 모델 추가 부분의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.