如何在添加不编辑时验证django表单

时间:2010-10-29 10:24:33

标签: python django validation django-forms

我们怎么能让django表单不验证我们是否正在编辑,而不是添加新记录。代码如下:

class PageForm(forms.Form):
    name = forms.CharField(max_length=100,widget=forms.TextInput(attrs={'class':'textInput'}))
    description = forms.CharField(max_length=300, required=False,widget=forms.TextInput(attrs={'class':'textInput'}))
    body = forms.CharField(widget=forms.Textarea)
    template = forms.CharField(max_length=30,widget=forms.TextInput(attrs={'class':'textInput'}))
    navbar = forms.BooleanField(required=False, widget=forms.Select(choices=(('True','True'),
                                                                             ('False', 'False'))))
    publish = forms.BooleanField(widget=forms.Select(choices=(('Published','Publish Now'),
                                                              ('Private','Private'),
                                                              ('Draft','Draft'))))

    def save(self, page=None, commit=True):
        data = self.cleaned_data
        if not page: 
            page = models.Page(key_name=data['name'].replace(' ','-'))
        page.name = data['name']
        page.description = data['description']
        page.body = data['body']
        page.template = data['template']
        page.publish = data['publish']
        if commit: page.put()
        return page


    # prevent the same page 's name
    def clean_name(self):
        name = self.cleaned_data['name']
        query = models.Page.all(keys_only=True)
        query.filter('name = ', name)

        page = query.get()

        if page:
            raise forms.ValidationError('Page name "%s" was already used before' % name)

        return name

此名称验证的目的是防止具有相同名称的记录。 BUt我发现,它也在编辑时验证,所以我们无法编辑记录,因为它会说'同名的记录已经存在'。

实际上对于编辑,保存功能的页面参数不会是none,而是prev record,并且在保存新的时不会是。但是我们如何在clean_name函数上读取这个参数,以便我们现在可以编辑还是创建它?

非常感谢!

4 个答案:

答案 0 :(得分:2)

如果您正在编辑表单,那么表单有一些实例,您可以检查是否存在。

如果是,那么你可能正在编辑现有对象..对吗?

实施例: 如果您正在使用表单编辑对象,则可以像这样创建表单对象:

form = MyForm(instance = myobject)

然后在表单类方法中,您可以检查表单是否已按照此处描述的方式保存实例: Test if Django ModelForm has instance

答案 1 :(得分:2)

在你的clean方法中,你可以使用self.initial来知道它是添加还是编辑。如果正在编辑,则 self.initial 不会为空。但是当它添加时,self.initial 将是前一个值的字典。

答案 2 :(得分:0)

clean_name函数中的

从查询集中排除当前对象

query.filter('name = ', name).exclude(pk=self.pk)

或更改if条件以检查页面和当前对象是否不相同。

答案 3 :(得分:0)

很抱歉,我无法在你的帖子下面发表评论,不知道为什么。

@sunn0:我没有使用django模型,因为在appengine中部署应用程序,所以请改用appengine模型。

@Zayatzz:你可以展示一些代码怎么做?由于我们是在添加还是编辑,我们总是将表单绑定到request.POST验证之前,所以不知道如何区分。

@Ashok:我根据你的建议做了一个解决方法。由于之前我没有将pk传递给form,而是将prev对象作为param传递,因此无法通过使用pk排除。因此,我更改代码并将其他密钥设置为pk(如果创建,则将密钥清空,但如果使用pk编辑填充密钥)并仅检入条件,如果密钥字段不为空,则表示我们正在编辑。不确定这是否是最佳做法,但无论如何都可行。