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 %} + + \ 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 %} + + 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 %}