이것은 HTMX와 Django를 사용하여 Todo 앱을 구축하는 방법에 대한 시리즈의 두 번째 게시물입니다. 1부를 보려면 여기를 클릭하세요.
2부에서는 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
마지막으로 관리자 페이지를 등록할 수 있습니다.
# 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를 추가할 수 있습니다!
2부가 끝날 때까지 전체 코드를 확인하고 싶다면 Github 02부 브랜치에서 확인하실 수 있습니다.
위 내용은 Django 및 HTMX를 사용하여 To-Do 앱 만들기 - TDD를 사용하여 Todo 모델 추가 부분의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!