Проект, що реалізується в цьому розділі, — система управління нотатками на основі фреймворку Django. Користувач може додавати нотатки та описи до них. Додавати будь-яку кількість тегів у нотатці, а, значить, і створювати унікальні для себе теги. Нотатки можуть бути позначені як виконані або можуть бути видалені як не актуальні. Також ми додамо в проект авторизацію та аутентифікацію користувачів, можливість завантажувати аватарку для користувача.
scipts/docker_build_docker-compose.cmd
[+] Building 28.8s (13/13) FINISHED docker:default
=> [code internal] load build definition from Dockerfile 0.1s
=> => transferring dockerfile: 1.11kB 0.0s
=> [code internal] load .dockerignore 0.1s
=> => transferring context: 154B 0.0s
=> [code internal] load metadata for docker.io/library/python:3.11 2.7s
=> [code auth] library/python:pull token for registry-1.docker.io 0.0s
=> [code 1/7] FROM docker.io/library/python:3.11@sha256:652c9f890a7f38bab4d67ee95c54d72955792623122cfea0a87aa74d927e41ae 0.1s
=> => resolve docker.io/library/python:3.11@sha256:652c9f890a7f38bab4d67ee95c54d72955792623122cfea0a87aa74d927e41ae 0.1s
=> [code internal] load build context 0.1s
=> => transferring context: 5.15kB 0.0s
=> CACHED [code 2/7] WORKDIR /app 0.0s
=> [code 3/7] COPY . . 0.1s
=> [code 4/7] COPY run.sh run.sh 0.1s
=> [code 5/7] COPY notes/ notes/ 0.1s
=> [code 6/7] COPY requirements.txt requirements.txt 0.1s
=> [code 7/7] RUN pip install -r requirements.txt 23.9s
=> [code] exporting to image 1.3s
=> => exporting layers 1.3s
=> => writing image sha256:e019f6cb476c7abd1394edd3c3ad106d29bb0b9aa45ab04ba521db24c4e38806 0.0s
=> => naming to docker.io/library/lect_10_02_notes-code 0.0s
[+] Running 2/2
✔ Container lect_10_02_notes-pg-1 Running 0.0s
✔ Container lect_10_02_notes-code-1 Started 14.3s
copy 2 files to your folder:
- docker-compose.yml
- .env
Run in console:
docker compose pull
docker compose up -d
open in browser http://localhost:8000
https://hub.docker.com/repository/docker/lexxai/goit_web_lect_10_02_notes
Насправді наш застосунок можна трохи покращити. Як самостійне завдання ми рекомендуємо вам дописати наступний функціонал:
- Зробіть можливість видаляти і виконані завдання (зараз застосунок видаляє тільки невиконані нотатки).
- Реалізуйте можливість, окрім виведення на головній сторінці всіх нотаток, виведення лише завершених або незавершених нотаток на вибір.
- Реалізуйте можливість редагування та видалення тегів та окремий перегляд усіх своїх тегів.
- Реалізуйте можливість редагування незавершених нотаток
- Pagination
- Count notes with tag
- Confirm action modal JS.
view.py:
.....
queryset = Note.objects.filter(user=request.user).order_by("created").all()
paginator = Paginator(queryset, RECORDS_PER_PAGE)
page = paginator.page(page_num)
notes = (
page
if request.user.is_authenticated
else []
)
context = {"notes": notes, "page_num": page_num}
return render(request, "noteapp/index.html", context=context)
SQL page 1: LIMIT 6
(0.000) SELECT COUNT(*) AS "__count" FROM "noteapp_note" WHERE "noteapp_note"."user_id" = 2; args=(2,); alias=default
(0.000) SELECT "noteapp_note"."id", "noteapp_note"."name", "noteapp_note"."description", "noteapp_note"."done", "noteapp_note"."created", "noteapp_note"."user_id" FROM "noteapp_note" WHERE "noteapp_note"."user_id" = 2 ORDER BY "noteapp_note"."created" ASC LIMIT 6; args=(2,); alias=default
SQL page 2: LIMIT 2 OFFSET 6
(0.000) SELECT COUNT(*) AS "__count" FROM "noteapp_note" WHERE "noteapp_note"."user_id" = 2; args=(2,); alias=default
(0.000) SELECT "noteapp_note"."id", "noteapp_note"."name", "noteapp_note"."description", "noteapp_note"."done", "noteapp_note"."created", "noteapp_note"."user_id" FROM "noteapp_note" WHERE "noteapp_note"."user_id" = 2 ORDER BY "noteapp_note"."created" ASC LIMIT 2 OFFSET 6; args=(2,); alias=default
ORM:
@login_required
def tags(request):
tags = Tag.objects.filter(user=request.user).annotate(Count("note")).order_by("-note__count")
context = {"tags": tags}
return render(request, "noteapp/tags.html", context)
SQL:
(0.015) SELECT "noteapp_tag"."id", "noteapp_tag"."name", "noteapp_tag"."user_id", COUNT("noteapp_note_tags"."note_id") AS "note__count" FROM "noteapp_tag" LEFT OUTER JOIN "noteapp_note_tags" ON ("noteapp_tag"."id" = "noteapp_note_tags"."tag_id") WHERE "noteapp_tag"."user_id" = 2 GROUP BY "noteapp_tag"."id" ORDER BY 4 DESC; args=(2,); alias=default