2017-07-11 26 views
1

2つのフォーム(2つのモデル)を作成してそのビューを処理しようとしていたときに、このエラーが発生しました。私のSongFormは、AlbumFormがデータを完全に保存している間は、そのデータをデータベースに保存していません。djangoエラー:NOT NULL制約に失敗しました

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にあると思います。

+0

同じ質問を2回転記しないでください。複数のアカウントを作成しないでください。 –

答えて

2

曲のアルバムを保存する前に設定する必要があるように見えます。

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") 

save()方法は、モデル・インスタンスではなく、フォームのインスタンスを返すので、私は、album=albumform.save(commit=False)にコードを変更することに注意してください。

+0

ありがとうございました。それは今働いている。このコード行が何をしているのか教えてください。 'song.album = album'? –

+0

あなたの 'Song'モデルは' Album'への外部キーを持っています。アルバムを設定せずに「ソング」を作成しようとしていたため、エラーが発生しました。 'song.album = album'は新しく作ったアルバムに新しい曲の' album'を設定します。 – Alasdair

+0

はい。私は今これを持っています。ありがとう。 –

1

これは問題だと確信していましたが、あなたが私に与えたコードを使用しました。あなたのソングモデルにはnull=Trueなしのアルバムモデルへの外部キーがあるという事実のため、アルバムモデルなしで新しいソングを作成することはできません。

ソングがアルバムに属するかどうかを知るには、何らかのビジネスロジックが必要です。私の意見では、これらの2つを別々のエンドポイントに置くべきです。

ソングを作成するときは、ジャンルに基づいてリストのアルバムを選択する必要があります。

とにかく、null=Trueをアルバムに追加するだけで、これを超えることができます。あなたのソングモデルの外部キー属性。

関連する問題