Django -: добавление нескольких песен в список воспроизведения

#python #django

#python #django

Вопрос:

я создаю список воспроизведения, чтобы добавить в него песни … но я не могу добавить несколько песен…я не знаю, как добавить.

models.py —>

 from django.db import models
from django.contrib.auth.models import User
# Create your models here.

class Song(models.Model):
    movie=models.CharField(max_length=200,blank=True)
    song_name=models.CharField(max_length=200)
    artist=models.CharField(max_length=200)
    year=models.IntegerField()
    image=models.ImageField(upload_to='images/')
    song_file=models.FileField(upload_to='songs/')



    def __str__(self):
        return self.song_name

class Playlist(models.Model):
    list_name=models.CharField(max_length=100)
    user=models.ForeignKey(User,on_delete=models.CASCADE)
    song=models.ForeignKey(Song,on_delete=models.CASCADE,blank=True,default=None,null=True)

    def __str__(self):
        return self.list_name
 

views.py —> в этом у меня есть функция addsongs_view, с помощью которой я пытаюсь добавить песни в список воспроизведения, но она добавляет только одну песню в список воспроизведения, и эта песня обновляется для всех других списков воспроизведения, т.Е. Если я добавляю одну песню в playlist_1…это также добавляется в playlist_2 и остальные другие.

** Я хочу добавить несколько песен в список воспроизведения, и эти песни не должны добавляться в другой список воспроизведения, если я не добавляю его, пожалуйста, помогите мне, спасибо 🙂 **

 from django.shortcuts import render,redirect,get_object_or_404
from .models import Song,Playlist
from django.contrib.auth.models import User

# Create your views here.


def home_view(request):
    songs=Song.objects
    return render(request,'home.html',{'songs':songs})



def allplaylists_view(request):
    playlists=Playlist.objects
    currentuser=request.user
    return render(request,'allplaylists.html',{'playlists':playlists, 'currentuser':currentuser})

def playlistsongs_view(request):
    playlists=Playlist.objects.all()
    playlistName=request.GET.get('name')
    return render(request,'playlistsongs.html',{'playlists':playlists, 'playlistName':playlistName})

def createplaylist_view(request):
    songs=Song.objects
    if request.method == 'POST':
        playlist=Playlist()
        playlist.list_name=request.POST['playlistname']
        playlist.user=request.user
        playlist.save()
        print(playlist.list_name,playlist.user)
        return render(request,'addsongs.html',{'songs':songs})
else:
    return render(request,'createplaylist.html',{'songs':songs})

def addsongs_view(request,pk):
    songs=Song.objects.all()
    playlist=Playlist.objects
    if request.method == 'POST':
        item=Song.objects.get(id=pk)
        playlist.song=item
        Playlist.objects.update(song=item)
        return render(request,'addsongs.html',{'songs':songs})
        return render(request,'addsongs.html',{'songs':songs})
 

urls.py ——> (речь идет не о счетах…это работает нормально)

 from django.contrib import admin
from django.urls import path,include
from boom import views
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path('admin/', admin.site.urls),
    path('accounts/',include('accounts.urls')),
    path('', views.home_view, name='home'),
    path('allplaylists/',views.allplaylists_view,name='allplaylists'),
    path('playlistsongs/',views.playlistsongs_view,name='playlistsongs'),
    path('createplaylist/',views.createplaylist_view,name='createplaylist'),
    path('createplaylist/<int:pk>',views.addsongs_view,name='addsongs'),
] static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)
 

Ответ №1:

Вам необходимо изменить отношение списка воспроизведения к песне с ForeignKey на поле ManyToMany:

 class Playlist(models.Model):
    list_name=models.CharField(max_length=100)
    user=models.ForeignKey(User,on_delete=models.CASCADE)
    songs=models.ManyToManyField(Song)
 

И добавьте несколько таких песен:

 def createplaylist_view(request):
    songs=Song.objects
    if request.method == 'POST':
        playlist=Playlist()
        playlist.list_name=request.POST['playlistname']
        playlist.user=request.user
        playlist.save()
        print(playlist.list_name,playlist.user)
        playlist.songs.add(*songs)  # <-- here
        return render(request,'addsongs.html',{'songs':songs})
else:
    return render(request,'createplaylist.html',{'songs':songs})
 

К вашему сведению, пожалуйста, рассмотрите возможность использования форм Django для хранения данных.

Ответ №2:

У вас есть свой ответ, но позвольте мне объяснить, почему вы должны использовать ManyToMany (m2m), а не ForeignKey (FK)

Это просто потому, что песня может существовать во многих списках воспроизведения, а в списке воспроизведения может быть много песен.

То FK , что вы сделали, говорит о другом: в списке воспроизведения может быть только одна песня (это ключ к списку воспроизведения!), И песня может существовать во многих списках воспроизведения, то есть во многих списках воспроизведения, в которых есть только одна песня, вы этого не хотите.

К вашему сведению: вы должны использовать формы, если это HTML-шаблон, который нуждается в рендеринге, и вы можете использовать Django rest framework, если это API без состояния.