NOT NULL约束失败:music_song.album_id

时间:2017-10-31 09:57:36

标签: python django

我正在使用django 1.11.6和python 3.6.2

我是django的新手,没有人帮助我住在哪里,所以你们都是我的希望

在添加歌曲部分的django应用程序中我遇到了错误

错误消息=

  

/ music / album / 5 / AddSong / NOT NULL约束中的IntegrityError失败:   music_song.album_id

这是我的观点文件:

from django.views import generic
from django.views.generic import View
from .forms import UserForm
from django.views.generic.edit import CreateView,UpdateView,DeleteView
from django.shortcuts import render,redirect
from django.contrib.auth import authenticate, login

from .models import Album, Song
from django.core.urlresolvers import reverse_lazy


class IndexView(generic.ListView):
    template_name = 'music/index.html'
    context_object_name = 'all_albums'

    def get_queryset(self):
        return Album.objects.all()


class DetailView(generic.DetailView):
    model = Album
    template_name = 'music/detail.html'
    context_object_name = 'album'


class AlbumCreate(CreateView):
    model = Album
    fields = ['artist', 'album_title', 'genre', 'album_logo']


class SongCreate(CreateView):
    model = Song
    fields = ['song_title', 'file_type']



class AlbumUpdate(UpdateView):
    model = Album
    fields = ['artist', 'album_title', 'genre', 'album_logo']


class AlbumDelete(DeleteView):
    model = Album
    success_url = reverse_lazy('music:index')


class UserFormView(View):
    form_class = UserForm
    template_name = 'music/registration_form.html'


    #display a blank form
    def get(self,request):

        form = self.form_class(None)
        return render(request,self.template_name, {"form": form})


    #procces form data
    def post(self,request):
        form = self.form_class(request.POST)

        if form.is_valid():

            user = form.save(commit=False)

            #cleaned (normalized)  data

            username = form.cleaned_data['username']
            password = form.cleaned_data['password']
            user.set_password(password)
            user.save()


            #returns User objects if credentials are correct

            user = authenticate(username=username, password=password)

            if user is not None:

                if user.is_active:

                    login(request,user)
                    return redirect('music:index')

        return render(request,self.template_name, {"form": form})

这是我的models.py:

from django.db import models
from django.core.urlresolvers import reverse

class Album(models.Model):
    artist = models.CharField(max_length=250)
    album_title = models.CharField(max_length=500)
    genre = models.CharField(max_length=100)
    album_logo = models.FileField()

    def get_absolute_url(self):
        return reverse('music:detail', kwargs={'pk': self.pk})


    def __str__(self):
        return self.album_title + ' - ' + self.artist

class Song(models.Model):
    album = models.ForeignKey(Album, on_delete=models.CASCADE)
    file_type = models.CharField(max_length=10)
    song_title = models.CharField(max_length=250)
    is_favorite = models.BooleanField(default=False)
    # song_file = models.FileField(null=True)

    def __str__(self):
        return self.song_title

    def get_absolute_url(self):
        return reverse('music:detail', kwargs={'pk': self.album.id})

urls.py:

from django.conf.urls import url
from . import views

app_name = 'music'

urlpatterns = [
    # /music/
    url(r'^$', views.IndexView.as_view(), name='index'),
    url(r'^register/$', views.UserFormView.as_view(), name='register'),

    # /music/album/54

    url(r'^album/(?P<pk>[0-9]+)/$', views.DetailView.as_view(), name='detail'),
    # music/album/add
    url(r'album/add/$', views.AlbumCreate.as_view(), name='album-add'),



    # music/album/3/AddSong
    url(r'album/(?P<pk>[0-9]+)/AddSong/$', views.SongCreate.as_view(), name='song-add'),

    # music/album/2/update/
    url(r'album/(?P<pk>[0-9]+)/AlbumUpdate/$', views.AlbumUpdate.as_view(), name='album-update'),


    # music/album/2/delete/
    url(r'album/(?P<pk>[0-9]+)/AlbumDelete/$', views.AlbumDelete.as_view(), name='album-delete'),

]

为了创建我使用Django内置表单的表单,我必须创建一个用于添加专辑,另一个用于添加专辑的歌曲

这是我的album_form.html屏幕截图 enter image description here

这是我的form-template.html屏幕截图:

enter image description here

这是我的song_form.html截图

enter image description here

1 个答案:

答案 0 :(得分:0)

form_valid方法中,您应该从url kwargs中获取相册pk并在表单实例上设置相册。

from. django.shortcuts import get_object_or_404

class SongCreate(CreateView):
    model = Song
    fields = ['song_title', 'file_type']

    def form_valid(self, form):
        album = get_object_or_404(Album, pk=self.kwargs['pk']
        form.instance.album = album
        return super(SongCreate, self).form_valid(form)