Ini adalah siaran kedua siri kami tentang cara membina apl Todo menggunakan HTMX dan Django. Klik di sini untuk bahagian 1.
Dalam bahagian 2, kami akan mencipta model Todo dan melaksanakan fungsi asasnya dengan ujian unit.
Dalam models.py mari buat model Todo, dengan atribut asasnya. Kami mahu item Todo dikaitkan dengan UserProfile, supaya pengguna hanya akan melihat item mereka sendiri. Item todo juga akan mempunyai tajuk dan atribut boolean is_completed. Kami mempunyai banyak idea masa depan untuk model Todo, seperti keupayaan untuk menetapkan tugas sebagai "sedang berjalan" selain selesai atau tidak dimulakan, dan tarikh akhir, tetapi itu untuk kemudian. Mari kita permudahkan sekarang untuk mempunyai sesuatu pada skrin secepat mungkin.
Nota: Dalam apl dunia sebenar, kita mungkin perlu mempertimbangkan untuk menggunakan UUID sebagai kunci utama pada model UserProfile dan Todo, tetapi kami akan memastikannya mudah sekarang.
# 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
Mari jalankan migrasi untuk model baharu:
❯ 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
Mari kita tulis ujian pertama pada projek kami. Kami ingin memastikan bahawa pengguna hanya akan melihat item todo mereka sendiri, dan bukan item daripada pengguna lain.
Untuk membantu kami menulis ujian, kami akan menambah kebergantungan pembangunan baharu pada projek kami, model-bakeri, yang memudahkan proses mencipta contoh model Django tiruan. Kami juga akan menambah 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
Dalam pyproject.toml kita perlu mengkonfigurasi pytest, dengan menambah beberapa baris pada penghujung fail:
# pyproject.toml # NEW [tool.pytest.ini_options] DJANGO_SETTINGS_MODULE = "todomx.settings" python_files = ["test_*.py", "*_test.py", "testing/python/*.py"]
Sekarang mari tulis ujian pertama kami untuk memastikan pengguna hanya mempunyai akses kepada tugas mereka sendiri.
# 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"}
Kami menggunakan fail conftest.py daripada pytest untuk mempunyai tempat untuk semua lekapan yang kami rancang untuk digunakan dalam ujian kami. Pustaka model_bakery memudahkan untuk membuat contoh UserProfile dan Todo dengan boilerplate minimum.
#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
Jom jalankan ujian kami!
❯ 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
Akhir sekali, kami boleh mendaftarkan halaman admin untuknya:
# 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"]
Kini kami boleh menambah beberapa Todo daripada pentadbir!
Jika anda ingin menyemak keseluruhan kod sehingga akhir bahagian 2, anda boleh menyemaknya di Github di cawangan bahagian 02.
Atas ialah kandungan terperinci Mencipta apl Tugasan dengan Django dan HTMX - Bahagian Menambah model Todo dengan TDD. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!