0

「テレビ番組の追加フォーム」用に、タイトルフィールドと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の検証は、コードが実行される前のどこかで行われていますが、それを追跡できないようです。

よろしくお願いします。

4

2 に答える 2

0

clean_season()return を空のインスタンスにすることでなんとか解決しTvshow()、 に小さな変更を加えましたclean()。これは私が今まで書いた中で最も美しいコードではありませんが、仕事は完了です。

def clean_season(self):
    """Must return a Song instance, whatever the cost."""
    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 Tvshow()

def clean(self):
    """Create a tvshow in case there is no tvshow yet."""
    cd = super(SeasonMinimalModelForm, self).clean()
    if not cd['tvshow'].title:
        try:
            cd['title']
        except KeyError:
            raise forms.ValidationError("Please provide at least a title.")
        else:
            cd['tvshow'] = Tvshow(title = cd['title'])
            cd['tvshow'].save()
    return cd
于 2012-08-19T09:56:01.893 に答える
0

tvshow_idfromの値を返す必要がありますclean_season

于 2012-08-18T15:34:55.000 に答える