Добавил недостающие шаблоны, добавил related_name в моделях, добавил недостающие urls

This commit is contained in:
Viner Abubakirov
2026-01-02 12:58:36 +05:00
parent 8af3cbee92
commit 6231de70ea
15 changed files with 147 additions and 27 deletions

View File

@@ -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'),
),
]

View File

@@ -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'),
),
]

View File

@@ -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'),
),
]

View File

@@ -10,7 +10,7 @@ class Artist(BaseModel):
class Album(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) name = models.CharField(max_length=200)
def __str__(self): def __str__(self):
@@ -19,7 +19,7 @@ class Album(BaseModel):
class Track(BaseModel): class Track(BaseModel):
title = models.CharField(max_length=200) 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/") file = models.FileField(upload_to="music/")
def __str__(self): def __str__(self):

View File

@@ -1,8 +1,12 @@
from django.urls import path from django.urls import path
from music.views import TrackListView from music.views import TrackListView
from music.views import AlbumListView from music.views import AlbumListView
from music.views import AlbumDetailView
from music.views import ArtistListView from music.views import ArtistListView
from music.views import ArtistDetailView
app_name = "music" app_name = "music"
@@ -10,5 +14,7 @@ app_name = "music"
urlpatterns = [ urlpatterns = [
path("tracks/", TrackListView.as_view(), name="track_list"), path("tracks/", TrackListView.as_view(), name="track_list"),
path("albums/", AlbumListView.as_view(), name="album_list"), path("albums/", AlbumListView.as_view(), name="album_list"),
path("albums/<int:pk>/", AlbumDetailView.as_view(), name="album_detail"),
path("artists/", ArtistListView.as_view(), name="artist_list"), path("artists/", ArtistListView.as_view(), name="artist_list"),
path("artists/<int:pk>/", ArtistDetailView.as_view(), name="artist_detail"),
] ]

View File

@@ -4,6 +4,7 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
<link rel="stylesheet" href="{% static '/css/main.css' %}"> <link rel="stylesheet" href="{% static '/css/main.css' %}">
{% block head_extra %}{% endblock %} {% block head_extra %}{% endblock %}
<title>{% block title %}Музыкальный сервис{% endblock %}</title> <title>{% block title %}Музыкальный сервис{% endblock %}</title>

View File

@@ -0,0 +1,11 @@
{% load static %}
<ul>
{% for album in albums %}
<li>
<a href="{% url 'music:album_detail' album.id %}">{{ album.name }}</a> by {{ album.artist }}
</li>
{% empty %}
<li>No albums available.</li>
{% endfor %}
</ul>

View File

@@ -0,0 +1,11 @@
{% load static %}
<ul>
{% for artist in artists %}
<li>
<a href="{% url 'music:artist_detail' artist.id %}">{{ artist.name }}</a>
</li>
{% empty %}
<li>No artists available.</li>
{% endfor %}
</ul>

View File

@@ -0,0 +1,23 @@
{% load static %}
<link rel="stylesheet" href="{% static 'css/track_list.css' %}">
<div class="container">
<ul class="track-list">
{% if tracks %}
{% for track in tracks %}
<li class="track-item" data-track-id="{{ track.id }}" data-track-src="{{ track.file.url }}">
<div class="track-info">
<h3 class="track-title">{{ track.title }}</h3>
<p class="track-artist">Исполнитель: {{ track.album.artist }}</p>
</div>
</li>
{% endfor %}
{% else %}
<div class="empty-state">
<i class="fas fa-music"></i>
<p>Нет добавленных треков</p>
</div>
{% endif %}
</ul>
</div>
{% include 'components/player.html' %}

View File

@@ -0,0 +1,11 @@
{% extends "base.html" %}
{% block title %}Album Detail{% endblock %}
{% block content %}
<h1>{{ album.name }}</h1>
<p>Artist: {{ album.artist }}</p>
<p>Release Date: {{ album.release_date }}</p>
<h2>Tracks</h2>
{% include 'components/track_list.html' with tracks=album.tracks.all %}
{% endblock %}

View File

@@ -0,0 +1,7 @@
{% extends "base.html" %}
{% block title %}Album List{% endblock %}
{% block content %}
<h1>Album List</h1>
{% include 'components/album_list.html' with albums=albums %}
{% endblock %}

View File

@@ -0,0 +1,10 @@
{% extends "base.html" %}
{% block title %}Artist Detail{% endblock %}
{% block content %}
<h1>{{ artist.name }}</h1>
<p>Genre: {{ artist.genre }}</p>
<h2>Albums</h2>
{% include 'components/album_list.html' with albums=artist.albums.all %}
{% endblock %}

View File

@@ -0,0 +1,7 @@
{% extends "base.html" %}
{% block title %}Artist List{% endblock %}
{% block content %}
<h1>Artist List</h1>
{% include 'components/artist_list.html' with artists=artists %}
{% endblock %}

View File

@@ -1,29 +1,5 @@
{% extends 'base.html' %} {% extends 'base.html' %}
{% load static %}
{% block head_extra %}
<link rel="stylesheet" href="{% static 'css/track_list.css' %}">
{% endblock head_extra %}
{% block content %} {% block content %}
<div class="container"> {% include 'components/track_list.html' %}
<ul class="track-list">
{% if tracks %}
{% for track in tracks %}
<li class="track-item" data-track-id="{{ track.id }}" data-track-src="{{ track.file.url }}">
<div class="track-info">
<h3 class="track-title">{{ track.title }}</h3>
<p class="track-artist">Исполнитель: {{ track.album.artist }}</p>
</div>
</li>
{% endfor %}
{% else %}
<div class="empty-state">
<i class="fas fa-music"></i>
<p>Нет добавленных треков</p>
</div>
{% endif %}
</ul>
</div>
{% include 'player.html' %}
{% endblock %} {% endblock %}