django错误:非空约束失败

django错误:非空约束失败,django,django-models,django-forms,django-views,Django,Django Models,Django Forms,Django Views,当我试图创建两个表单(使用两个模型)并在视图中处理它时,我遇到了这个错误。我的SongForm并没有将数据保存在数据库中,而AlbumForm则完美地保存了数据 views.py- def formm(request): if request.method=='POST': songform = SongForm(request.POST) albumform=AlbumForm(request.POST) if songform.is_valid() and album

当我试图创建两个表单(使用两个模型)并在视图中处理它时,我遇到了这个错误。我的SongForm并没有将数据保存在数据库中,而AlbumForm则完美地保存了数据

views.py-

def formm(request):
if request.method=='POST':
    songform = SongForm(request.POST)
    albumform=AlbumForm(request.POST)
    if songform.is_valid() and albumform.is_valid():
        songform.save()
        albumform=albumform.save(commit=False)
        albumform.date=timezone.now()
        albumform.save()
        return redirect("result")
forms.py-

from django import forms
from . models import Album,Song

class SongForm(forms.ModelForm):
    class Meta:
        model=Song
        fields=('song_title','genre')

class AlbumForm(forms.ModelForm):
    class Meta:
        model=Album
        fields=('album_title',)
models.py-

from __future__ import unicode_literals
from django.db import models

class Album(models.Model):
    album_title=models.CharField(max_length=50)
    date=models.DateTimeField(blank=True,null=True)

def __str__(self):
    return self.album_title

class Song(models.Model):
    song_title=models.CharField(max_length=50)
    genre=models.CharField(max_length=50)
    album=models.ForeignKey(Album,on_delete=models.CASCADE)

    def __str__(self):
       return self.song_title
formmpage.html-

    {% extends "musicapp/basepage.html" %}

{% block content %}

<form method="POST" class="post-form">
    {% csrf_token %}
    {{ songform.as_p }}
        {{ albumform.as_p }}


    <button type="submit" class="btn btn-info">POST</button>
</form>


{% endblock %}
{%extensed“musicapp/basepage.html”%}
{%block content%}
{%csrf_令牌%}
{{songform.as_p}}
{{albumform.as_p}}
邮递
{%endblock%}

请纠正我,我到底做错了什么。我猜它在我的视图中。py。

看起来您应该在保存歌曲之前设置歌曲的相册

if songform.is_valid() and albumform.is_valid():
    album = albumform.save(commit=False)
    album.date = timezone.now()
    album.save()
    song = songform.save(commit=False)
    song.album = album
    song.save()
    return redirect("result")

注意,我将代码更改为
album=albumform.save(commit=False)
,因为
save()
方法返回的是模型实例,而不是表单实例。

确定,我确信这就是问题所在,但我使用了您给我的代码,我得到了一个完整性错误,因为您的歌曲模型具有专辑模型的外键,但没有
null=True
它将不允许您在没有专辑模型的情况下创建新歌曲

必须有某种商业逻辑才能知道一首歌是否属于专辑。在我看来,这两个端点应该是分开的

创建歌曲时,您应该能够从列表相册中根据流派选择它可能属于或不属于的歌曲


无论如何,您只需在歌曲模型的唱片集外键属性中添加
null=True
,就可以克服这一问题。

非常感谢。它现在正在工作。你能告诉我这行代码“song.album=album”的作用吗?你的
song
型号有一个指向
album
的外键。出现错误是因为您试图创建一首
歌曲
,但未设置唱片集。
song.album=album
将新歌的
album
设置为您刚刚创建的新唱片集。另外,您能否告诉我,“song.album=album”中的左侧唱片集是什么,右侧唱片集实际上是什么?我只是django的初学者。:)右侧的
相册
是您使用
album=albumform.save(commit=False)
保存相册表单时创建的
相册
。您正在将此问题分配给歌曲的相册字段,
song.album
。请不要发布同一问题两次,也不要为此创建多个帐户。