#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 без состояния.