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

Rom*_*cea 3 django django-forms

我有这个 django 字段,用于is_private指示用户所做的发布是否是私人的。如果发布是私人的,则private_room必须提及某个被调用的字段,否则需要一个被调用的字段public_room

clean_private_roomclean_public_room字段中,我正在检查is_private. 如果房间是私人的,那么在clean_public_room方法中我只返回一个空字符串""clean_private_room否则我继续验证。

问题是检查 withself.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' ]
Run Code Online (Sandbox Code Playgroud)

cat*_*ran 5

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