【发布时间】:2012-01-25 21:52:05
【问题描述】:
我有两个模型:
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: Cannot assign None: "Film.studio" does not allow null values 错误。我以为我是捕获所有错误,因此 django 永远不会意识到 Film.studio 是空的。
第二个问题是操作顺序。 如果我只想在确定 FilmForm 的其余部分有效后才保存 new_studio(从而防止在完整的电影条目通过之前保存一堆工作室名称)? 我是还是我会冒着提前保存的风险,因为 new_studio 保存在表单的清理中?
编辑:添加 Traceback 并编辑验证 if 语句
【问题讨论】:
-
检查此行是否符合您的意思:
if studio is None and new_studio == '':。工作室可以是''还是new_studio 是None?如果将其更改为if not (studio or new_studio):,它是否正确显示表单错误? -
我在 ValidationError 之前放了一个打印“here”。它出现在终端中,因此我可以确认代码已到达该部分。我尝试按照您的建议更改标准并得到相同的错误
-
你能粘贴回溯吗?
-
为什么要更改
if和elif检查?你现在使用的那个在逻辑中打开了漏洞,允许某些场景不受控制地通过。应该坚持我给你的。此外,clean方法仅在单独的clean_FIELD方法运行后运行,因此有效地,只有在其他一切都有效时才能到达这一点。当表单中仍有其他问题时,您不必担心创建工作室。 -
-ChrisPratt:公平点。前几次我运行它时,我无法让实例正常工作。可能是用户错误。上面编辑过,但我仍然有同样的问题
标签: django django-forms