我正在创建播放列表以添加歌曲....但是我不能添加多首歌…我不知道如何添加。
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)
您需要将Playlist to Song关系从ForeignKey更改为manymany字段:
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表单来存储数据。
你已经得到了答案,但让我解释一下为什么你应该使用 manymany (m2m)而不是ForeignKey (FK)
这仅仅是因为一首歌曲可以存在于多个播放列表中,而一个播放列表可以有多个歌曲。
您所做的FK
的事情说明了其他事情:播放列表只能有一个歌曲(它是播放列表的键!)和歌曲可以存在于许多播放列表也就是说,许多播放列表只有一首歌,你不想要的。
供参考:如果这是一个需要渲染的HTML模板,你应该使用表单,如果它是一个无状态API,你可以使用Django rest框架。