Django根据另一个字段的值验证字段

3
我有一个名为is_private的Django字段,用于指示用户发布内容是否为私有。如果发布是私有的,则必须提及一个称为private_room的特定字段,否则需要一个名为public_room的字段。
在clean_private_room和clean_public_room字段中,我正在检查is_private的值。如果房间是私人的,则在clean_public_room方法中,我仅返回一个空字符串"",并且同样适用于clean_private_room;否则,我将继续进行验证。
问题是,在这两种方法中,使用self.cleaned_data.get('is_private')检查会返回不同的结果。我尝试调试代码并将self.cleaned_data的值打印到终端中,其中一个方法的清理数据包含一个表单字段,而另一个方法包含我的完整发布值。
这是我的代码的一部分,请阅读其中的注释以查看我打印了哪里以及打印了什么。我不知道为什么它会这样行事。
class RoomForm( forms.ModelForm ):
    ...

    def clean_is_private( self ):
        if not 'is_private' in self.cleaned_data:
            raise forms.ValidationError("please select the type of room (private/public)")
        return self.cleaned_data.get("is_private")

    def clean_public_room( self ):
        print "<clean_public_room>"
        #   !!!!!!!!!
        #   when printing this one I only get one form value which is: public_room
        print self.cleaned_data

        if self.cleaned_data.get("is_private"):
            return ""

        #   otherwise....
        if not self.cleaned_data.get("public_room"):
            raise forms.ValidationError(
                'you need to mention a public room'
            )
        return self.cleaned_data[ 'public_room' ]

    def clean_private_room( self ):
        print "<clean_private_room>"
        #   !!!!!!!!!
        #   when printing this one I get all form values: public_room, private_room, is_private
        print self.cleaned_data

        if not self.cleaned_data.get("is_private"):
            return ""

        #   otherwise....
        if not self.cleaned_data.get("private_room"):
            raise forms.ValidationError(
                'you need to mention a private room'
            )
        return self.cleaned_data[ 'private_room' ]

https://docs.djangoproject.com/en/1.7/ref/forms/validation/#cleaning-and-validating-fields-that-depend-on-each-other - Peter DeGlopper
1个回答

5

表单字段按照定义顺序进行清理。因此,您只需要在字段列表中将is_private字段放在public_room之前即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接