gpt4 book ai didi

django - 在 Django 表单中捕获验证错误

转载 作者:行者123 更新时间:2023-12-04 06:00:08 24 4
gpt4 key购买 nike

我有两个模型:

class Studio(models.Model):
name = models.CharField("Studio", max_length=30, unique=True)

class Film(models.Model):
studio = models.ForeignKey(Studio, verbose_name="Studio")
name = models.CharField("Film Name", max_length=30, unique=True)

我有一个电影表单,允许用户选择一个预先存在的工作室,或者输入一个新的工作室(在 earlier question 的帮助下:
class FilmForm(forms.ModelForm):
required_css_class = 'required'
studio = forms.ModelChoiceField(Studio.objects, required=False, widget = SelectWithPlus)
new_studio = forms.CharField(max_length=30, required=False, label = "New Studio Name", widget = DeSelectWithX(attrs={'class' : 'hidden_studio_field'}))

def __init__(self, *args, **kwargs):
super(FilmForm, self).__init__(*args,**kwargs)
self.fields['studio'].required = False

def clean(self):
cleaned_data = self.cleaned_data
studio = cleaned_data.get('studio')
new_studio = cleaned_data.get('new_studio')

if not studio and not new_studio:
raise forms.ValidationError("Must specify either Studio or New Studio!")
elif not studio:
studio, created = Studio.objects.get_or_create(name = new_studio)
self.cleaned_data['studio'] = studio

return super(FilmForm,self).clean()

class Meta:
model = Film

现在,我的第一个问题是当 studio 和 new_studio 都丢失时 我得到一个 django ValueError:无法分配无:“Film.studio”不允许空值错误。 我以为我正在捕获所有错误,因此 django 永远不应该意识到 Film.studio 是空的。

第二个问题是操作顺序。 如果我只想在确定 FilmForm 的其余部分有效后才保存 new_studio(从而防止在完整的电影条目也通过之前保存一堆工作室名称)怎么办? 我是清楚的还是因为 new_studio 被保存在表单的清理中而冒着过早保存的风险?

编辑:添加 Traceback并编辑验证 if 语句

最佳答案

删除 工作室 new_studio 来自cleaned_data。

    if not studio and not new_studio:
del cleaned_data['studio'], cleaned_data['new_studio']
raise forms.ValidationError("Must specify either Studio or New Studio!")

关于django - 在 Django 表单中捕获验证错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9010852/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com