From 6231de70eaf0b3dd2a8f317300ca34dcd0b9c9f7 Mon Sep 17 00:00:00 2001 From: Viner Abubakirov Date: Fri, 2 Jan 2026 12:58:36 +0500 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=BD=D0=B5=D0=B4=D0=BE=D1=81=D1=82=D0=B0=D1=8E=D1=89=D0=B8?= =?UTF-8?q?=D0=B5=20=D1=88=D0=B0=D0=B1=D0=BB=D0=BE=D0=BD=D1=8B,=20=D0=B4?= =?UTF-8?q?=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20related=5Fname=20=D0=B2?= =?UTF-8?q?=20=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB=D1=8F=D1=85,=20=D0=B4=D0=BE?= =?UTF-8?q?=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=BD=D0=B5=D0=B4=D0=BE=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D1=8E=D1=89=D0=B8=D0=B5=20urls?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../migrations/0003_alter_track_album.py | 19 ++++++++++++++ .../migrations/0004_alter_track_album.py | 19 ++++++++++++++ .../migrations/0005_alter_album_artist.py | 19 ++++++++++++++ music_storage/music/models.py | 4 +-- music_storage/music/urls.py | 6 +++++ music_storage/templates/base.html | 1 + .../templates/components/album_list.html | 11 ++++++++ .../templates/components/artist_list.html | 11 ++++++++ .../templates/{ => components}/player.html | 0 .../templates/components/track_list.html | 23 ++++++++++++++++ .../templates/music/album_detail.html | 11 ++++++++ music_storage/templates/music/album_list.html | 7 +++++ .../templates/music/artist_detail.html | 10 +++++++ .../templates/music/artist_list.html | 7 +++++ music_storage/templates/music/track_list.html | 26 +------------------ 15 files changed, 147 insertions(+), 27 deletions(-) create mode 100644 music_storage/music/migrations/0003_alter_track_album.py create mode 100644 music_storage/music/migrations/0004_alter_track_album.py create mode 100644 music_storage/music/migrations/0005_alter_album_artist.py create mode 100644 music_storage/templates/components/album_list.html create mode 100644 music_storage/templates/components/artist_list.html rename music_storage/templates/{ => components}/player.html (100%) create mode 100644 music_storage/templates/components/track_list.html create mode 100644 music_storage/templates/music/album_detail.html create mode 100644 music_storage/templates/music/artist_detail.html diff --git a/music_storage/music/migrations/0003_alter_track_album.py b/music_storage/music/migrations/0003_alter_track_album.py new file mode 100644 index 0000000..3a75657 --- /dev/null +++ b/music_storage/music/migrations/0003_alter_track_album.py @@ -0,0 +1,19 @@ +# Generated by Django 6.0 on 2026-01-02 07:42 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('music', '0002_remove_track_artist'), + ] + + operations = [ + migrations.AlterField( + model_name='track', + name='album', + field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_DEFAULT, related_name='tracks', to='music.album'), + ), + ] diff --git a/music_storage/music/migrations/0004_alter_track_album.py b/music_storage/music/migrations/0004_alter_track_album.py new file mode 100644 index 0000000..35ea407 --- /dev/null +++ b/music_storage/music/migrations/0004_alter_track_album.py @@ -0,0 +1,19 @@ +# Generated by Django 6.0 on 2026-01-02 07:45 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('music', '0003_alter_track_album'), + ] + + operations = [ + migrations.AlterField( + model_name='track', + name='album', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='tracks', to='music.album'), + ), + ] diff --git a/music_storage/music/migrations/0005_alter_album_artist.py b/music_storage/music/migrations/0005_alter_album_artist.py new file mode 100644 index 0000000..91d3d9b --- /dev/null +++ b/music_storage/music/migrations/0005_alter_album_artist.py @@ -0,0 +1,19 @@ +# Generated by Django 6.0 on 2026-01-02 07:56 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('music', '0004_alter_track_album'), + ] + + operations = [ + migrations.AlterField( + model_name='album', + name='artist', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='albums', to='music.artist'), + ), + ] diff --git a/music_storage/music/models.py b/music_storage/music/models.py index 90b4863..3754049 100644 --- a/music_storage/music/models.py +++ b/music_storage/music/models.py @@ -10,7 +10,7 @@ class Artist(BaseModel): class Album(BaseModel): - artist = models.ForeignKey(Artist, on_delete=models.CASCADE) + artist = models.ForeignKey(Artist, on_delete=models.CASCADE, related_name="albums") name = models.CharField(max_length=200) def __str__(self): @@ -19,7 +19,7 @@ class Album(BaseModel): class Track(BaseModel): title = models.CharField(max_length=200) - album = models.ForeignKey(Album, blank=True, null=True, default=None, on_delete=models.SET_DEFAULT) + album = models.ForeignKey(Album, on_delete=models.CASCADE, related_name="tracks") file = models.FileField(upload_to="music/") def __str__(self): diff --git a/music_storage/music/urls.py b/music_storage/music/urls.py index 03db8bc..6fc5179 100644 --- a/music_storage/music/urls.py +++ b/music_storage/music/urls.py @@ -1,8 +1,12 @@ from django.urls import path from music.views import TrackListView + from music.views import AlbumListView +from music.views import AlbumDetailView + from music.views import ArtistListView +from music.views import ArtistDetailView app_name = "music" @@ -10,5 +14,7 @@ app_name = "music" urlpatterns = [ path("tracks/", TrackListView.as_view(), name="track_list"), path("albums/", AlbumListView.as_view(), name="album_list"), + path("albums//", AlbumDetailView.as_view(), name="album_detail"), path("artists/", ArtistListView.as_view(), name="artist_list"), + path("artists//", ArtistDetailView.as_view(), name="artist_detail"), ] diff --git a/music_storage/templates/base.html b/music_storage/templates/base.html index 5755799..c685368 100644 --- a/music_storage/templates/base.html +++ b/music_storage/templates/base.html @@ -4,6 +4,7 @@ + {% block head_extra %}{% endblock %} {% block title %}Музыкальный сервис{% endblock %} diff --git a/music_storage/templates/components/album_list.html b/music_storage/templates/components/album_list.html new file mode 100644 index 0000000..bc6207a --- /dev/null +++ b/music_storage/templates/components/album_list.html @@ -0,0 +1,11 @@ +{% load static %} + +
    + {% for album in albums %} +
  • + {{ album.name }} by {{ album.artist }} +
  • + {% empty %} +
  • No albums available.
  • + {% endfor %} +
\ No newline at end of file diff --git a/music_storage/templates/components/artist_list.html b/music_storage/templates/components/artist_list.html new file mode 100644 index 0000000..e1628f1 --- /dev/null +++ b/music_storage/templates/components/artist_list.html @@ -0,0 +1,11 @@ +{% load static %} + +
    + {% for artist in artists %} +
  • + {{ artist.name }} +
  • + {% empty %} +
  • No artists available.
  • + {% endfor %} +
diff --git a/music_storage/templates/player.html b/music_storage/templates/components/player.html similarity index 100% rename from music_storage/templates/player.html rename to music_storage/templates/components/player.html diff --git a/music_storage/templates/components/track_list.html b/music_storage/templates/components/track_list.html new file mode 100644 index 0000000..e9a33cc --- /dev/null +++ b/music_storage/templates/components/track_list.html @@ -0,0 +1,23 @@ +{% load static %} + + +
+
    + {% if tracks %} + {% for track in tracks %} +
  • +
    +

    {{ track.title }}

    +

    Исполнитель: {{ track.album.artist }}

    +
    +
  • + {% endfor %} + {% else %} +
    + +

    Нет добавленных треков

    +
    + {% endif %} +
+
+{% include 'components/player.html' %} diff --git a/music_storage/templates/music/album_detail.html b/music_storage/templates/music/album_detail.html new file mode 100644 index 0000000..cc315b5 --- /dev/null +++ b/music_storage/templates/music/album_detail.html @@ -0,0 +1,11 @@ +{% extends "base.html" %} + +{% block title %}Album Detail{% endblock %} + +{% block content %} +

{{ album.name }}

+

Artist: {{ album.artist }}

+

Release Date: {{ album.release_date }}

+

Tracks

+{% include 'components/track_list.html' with tracks=album.tracks.all %} +{% endblock %} \ No newline at end of file diff --git a/music_storage/templates/music/album_list.html b/music_storage/templates/music/album_list.html index e69de29..f21c728 100644 --- a/music_storage/templates/music/album_list.html +++ b/music_storage/templates/music/album_list.html @@ -0,0 +1,7 @@ +{% extends "base.html" %} +{% block title %}Album List{% endblock %} + +{% block content %} +

Album List

+{% include 'components/album_list.html' with albums=albums %} +{% endblock %} \ No newline at end of file diff --git a/music_storage/templates/music/artist_detail.html b/music_storage/templates/music/artist_detail.html new file mode 100644 index 0000000..7e28e4d --- /dev/null +++ b/music_storage/templates/music/artist_detail.html @@ -0,0 +1,10 @@ +{% extends "base.html" %} + +{% block title %}Artist Detail{% endblock %} + +{% block content %} +

{{ artist.name }}

+

Genre: {{ artist.genre }}

+

Albums

+{% include 'components/album_list.html' with albums=artist.albums.all %} +{% endblock %} \ No newline at end of file diff --git a/music_storage/templates/music/artist_list.html b/music_storage/templates/music/artist_list.html index e69de29..3f3fa13 100644 --- a/music_storage/templates/music/artist_list.html +++ b/music_storage/templates/music/artist_list.html @@ -0,0 +1,7 @@ +{% extends "base.html" %} + +{% block title %}Artist List{% endblock %} +{% block content %} +

Artist List

+{% include 'components/artist_list.html' with artists=artists %} +{% endblock %} diff --git a/music_storage/templates/music/track_list.html b/music_storage/templates/music/track_list.html index d92a21c..174857c 100644 --- a/music_storage/templates/music/track_list.html +++ b/music_storage/templates/music/track_list.html @@ -1,29 +1,5 @@ {% extends 'base.html' %} -{% load static %} -{% block head_extra %} - -{% endblock head_extra %} - {% block content %} -
-
    - {% if tracks %} - {% for track in tracks %} -
  • -
    -

    {{ track.title }}

    -

    Исполнитель: {{ track.album.artist }}

    -
    -
  • - {% endfor %} - {% else %} -
    - -

    Нет добавленных треков

    -
    - {% endif %} -
-
-{% include 'player.html' %} +{% include 'components/track_list.html' %} {% endblock %}