【问题标题】:django error: NOT NULL constraint faileddjango 错误:NOT NULL 约束失败
【发布时间】:2017-07-11 15:31:44
【问题描述】:

我在尝试制作两个表单(带有两个模型)并在视图中处理它时遇到此错误。我的 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 %}

请纠正我,实际上我做错了。我猜它在我的views.py中。

【问题讨论】:

  • 请不要重复发布相同的问题,也请不要创建多个帐户这样做。

标签: django django-models django-forms django-views


【解决方案1】:

看起来您应该在保存歌曲之前设置它的专辑。

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() 方法返回的是模型实例,而不是表单实例。

【讨论】:

  • 非常感谢。它现在正在工作。你能告诉我这行代码的作用吗,'song.album=album'?
  • 您的Song 模型有一个指向Album 的外键。您收到错误是因为您尝试创建 Song 而不设置相册。 song.album = album 将新歌的 album 设置为您刚刚创建的新专辑。
  • 另外,你能告诉我,'song.album = album' 中的专辑左侧是什么,右侧是什么?我只是 django 的初学者。 :)
  • 右侧的album 是您在使用album = albumform.save(commit=False) 保存相册表单时创建的album。您将其分配给歌曲的专辑字段song.album
【解决方案2】:

好的,我确定这是问题所在,但我使用了您提供给我的代码,但由于您的 Song 模型在没有 null=True 的情况下具有专辑模型的外键,因此出现完整性错误它不允许您在没有专辑模型的情况下创建新歌曲。

必须有某种业务逻辑才能知道一首歌是否属于专辑。在我看来,您应该将这 2 个放在不同的端点中。

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

无论如何,您只需在 Song 模型的专辑外键属性上添加 null=True 即可解决此问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-31
    • 2019-06-01
    • 2020-03-28
    • 2020-12-19
    相关资源
    最近更新 更多