Django 根据另一个字段的值验证字段
Django validate field based on value from another field
我有一个名为 is_private
的 django 字段,用于指示用户发布的帖子是否是私人的。如果帖子是私人的,则必须提及名为 private_room
的特定字段,否则需要名为 public_room
的字段。
在 clean_private_room
和 clean_public_room
字段中,我正在检查 is_private
的值。如果房间是私人的,那么在 clean_public_room
方法中我只是 return 一个空字符串 ""
和 clean_private_room
相同,否则我继续验证。
问题是使用 self.cleaned_data.get('is_private')
检查这两种方法的结果 return 不同。我尝试调试代码并将 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' ]
表单字段按照它们在表单中定义的顺序清理。所以你只需要将 is_private
字段放在字段列表中的 public_room
之前。
我有一个名为 is_private
的 django 字段,用于指示用户发布的帖子是否是私人的。如果帖子是私人的,则必须提及名为 private_room
的特定字段,否则需要名为 public_room
的字段。
在 clean_private_room
和 clean_public_room
字段中,我正在检查 is_private
的值。如果房间是私人的,那么在 clean_public_room
方法中我只是 return 一个空字符串 ""
和 clean_private_room
相同,否则我继续验证。
问题是使用 self.cleaned_data.get('is_private')
检查这两种方法的结果 return 不同。我尝试调试代码并将 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' ]
表单字段按照它们在表单中定义的顺序清理。所以你只需要将 is_private
字段放在字段列表中的 public_room
之前。