首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >捕获django窗体中的验证错误

捕获django窗体中的验证错误
EN

Stack Overflow用户
提问于 2012-01-25 21:52:05
回答 2查看 4.4K关注 0票数 2

我有两个模特:

代码语言:javascript
运行
复制
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)

我有一个电影表单,允许用户选择一个预先存在的工作室,或者键入一个新的工作室(在先前的问题的帮助下)

代码语言:javascript
运行
复制
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是空的。

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

编辑:添加 回溯 并编辑验证if-语句

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-26 00:49:44

studionew_studio中删除cleaned_data。

代码语言:javascript
运行
复制
    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!")
票数 2
EN

Stack Overflow用户

发布于 2012-01-26 03:27:59

关于防止预制滥调new_studio:

新的def清洁(自我):cleaned_data = self.cleaned_data studio = cleaned_data.get('studio') new_studio = cleaned_data.get('new_studio')

代码语言:javascript
运行
复制
    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!")
    elif not studio:
        del cleaned_data['studio']

    return super(FilmForm,self).clean()

并认为:

代码语言:javascript
运行
复制
def testone(request):
    if request.method == 'POST': # If the form has been submitted...
        form = FilmForm(request.POST) # A form bound to the POST data

        if form.is_valid(): # All validation rules pass
            if form.cleaned_data['new_studio']:
                studio, created = Studio.objects.get_or_create(name = form.cleaned_data['new_studio'])
                new_film = form.save(commit=False)
                new_film.studio = studio
            else:
                new_film = form

            new_film.save()
            return HttpResponseRedirect('/') # Redirect after POST
        else:
            form = FilmForm() # An unbound form

        return render_to_response('testone.html', {
            'form': form
        }, context_instance=RequestContext(request))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9010852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档