「テレビ番組の追加フォーム」用に、タイトルフィールドとtvshow_idフィールドのテンプレートを作成したいと思います。ユーザーは、タイトルCharFieldにタイトルを入力し、AJAXボタンを使用してデータベースから一致を取得できます。一致するものをクリックすると、jQueryの魔法を使用してtvshow_idフィールドに入力されます。ただし、そうでない場合でも、フォームはユーザーから提供されたタイトル文字列を使用して新しいtvshowインスタンスを作成する必要があるため、これでも問題ありません。
ただし、次のエラーが発生し続けます。
/ tvshows / create /season/のValueError
なしを割り当てることはできません:「Season.tvshow」はnull値を許可しません。
次のモデルがあるとします。
class Tvshow(models.Model):
title = models.CharField(max_length = 255)
class Season(models.Model):
tvshow = models.ForeignKey(Song)
そして、これが私の形です。私のフォームでは、テレビ番組は必要ないと述べていますが、私のモデルによれば必要です。これは、そうでない場合、フィールド自体がValidationErrorを発生させるためです。
class SeasonModelForm(models.ModelForm):
tvshow = forms.CharField(required = False)
def clean_season(self):
tvshow_id = self.cleaned_data['tvshow']
if tvshow_id:
try:
return Tvshow.objects.get(pk = tvshow_id)
except Tvshow.DoesNotExist:
raise forms.ValidationError("No tvshow with this ID was found.")
else: return None
def clean(self):
"""Assign a tvshow in case there is no Tvshow yet."""
cd = self.cleaned_data
if not isinstance(cd['tvshow'], Tvshow):
try:
cd['title']
except KeyError:
raise forms.ValidationError("Please provide at least a tvshow title.")
else:
cd['tvshow'] = Tvshow(title = cd['title'])
cd['tvshow'].save()
return cd
私の推測では、Season.tvshowの検証は、コードが実行される前のどこかで行われていますが、それを追跡できないようです。
よろしくお願いします。