Добавил недостающие шаблоны, добавил related_name в моделях, добавил недостающие urls
This commit is contained in:
19
music_storage/music/migrations/0003_alter_track_album.py
Normal file
19
music_storage/music/migrations/0003_alter_track_album.py
Normal 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'),
|
||||||
|
),
|
||||||
|
]
|
||||||
19
music_storage/music/migrations/0004_alter_track_album.py
Normal file
19
music_storage/music/migrations/0004_alter_track_album.py
Normal 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'),
|
||||||
|
),
|
||||||
|
]
|
||||||
19
music_storage/music/migrations/0005_alter_album_artist.py
Normal file
19
music_storage/music/migrations/0005_alter_album_artist.py
Normal 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'),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -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):
|
||||||
|
|||||||
@@ -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"),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
11
music_storage/templates/components/album_list.html
Normal file
11
music_storage/templates/components/album_list.html
Normal 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>
|
||||||
11
music_storage/templates/components/artist_list.html
Normal file
11
music_storage/templates/components/artist_list.html
Normal 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>
|
||||||
23
music_storage/templates/components/track_list.html
Normal file
23
music_storage/templates/components/track_list.html
Normal 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' %}
|
||||||
11
music_storage/templates/music/album_detail.html
Normal file
11
music_storage/templates/music/album_detail.html
Normal 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 %}
|
||||||
@@ -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 %}
|
||||||
10
music_storage/templates/music/artist_detail.html
Normal file
10
music_storage/templates/music/artist_detail.html
Normal 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 %}
|
||||||
@@ -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 %}
|
||||||
|
|||||||
@@ -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 %}
|
||||||
|
|||||||
Reference in New Issue
Block a user