[英]Django self.cleaned_data problems.
有一個在Django中創建的完全工作的表單 - 但是當我嘗試定義一個函數來引發自定義form.ValidationError
時它會中斷。
# importing form modules
from django import forms
import re
# define the forms
class single_input(forms.Form):
CHROMOSOMES = (
('1' , '1'),
('2' , '2'),
('3' , '3'),
('4' , '4'),
('5' , '5'),
('6' , '6'),
('7' , '7'),
('8' , '8'),
('9' , '9'),
('10' , '10'),
('11' , '11'),
('12' , '12'),
('13' , '13'),
('14' , '14'),
('15' , '15'),
('16' , '16'),
('17' , '17'),
('18' , '18'),
('19' , '19'),
('20' , '20'),
('21' , '21'),
('22' , '22'),
('23' , '23'),
('X' , 'X'),
('Y ' , 'Y')
)
def clean_testname(self):
print self.cleaned_data
testname = self.cleaned_data['testname']
genome_pos = self.cleaned_data['genome_pos']
if ( not re.match(r"^\w+$", testname)):
raise forms.ValidationError(
"Test name is only allowed letter's number's and _'s ."
"NO spaces or funny things that involve the shift button"
)
if ( not re.match(r"^\s+$", genome_pos)):
raise forms.ValidationError(
"Genome position is only allowed numbers and -'s"
"NO spaces, letter or funny things that involve the shift button"
)
return cleaned_data
testname = forms.CharField ( label='testname', max_length=100 )
chromosome = forms.ChoiceField( label='chromosome', choices = CHROMOSOMES , required = True)
genome_pos = forms.CharField ( label='genome_pos', max_length=15 )
問題是它只將第一個表單字段放入cleaned_data
因此上面代碼中的print cleaned_data
如下所示:
{'testname': u'ssss'}
如果我注釋掉整個clean_testname
函數,我得到一個工作輸出
{'genome_pos': u'xxx', 'testname': "name", 'chromosome': u'1'}
問題是您正在嘗試清理clean_testname
方法中的testname
和genome_pos
字段。
你應該清理testname
在外地clean_testname
方法和genome_pos
領域clean_genome_pos
方法。
如果要驗證彼此依賴的字段 ,則屬於clean
方法。 在這種情況下,它看起來不像你需要一個clean
方法,因為字段名稱似乎並不相互依賴。
class SingleInput(forms.Form):
# It would be better to name the form SingleInput rather than single_input
def clean_testname(self):
test_name = self.cleaned_data['testname']
# validate testname, raise ValidationError if necessary.
# you can't access any other fields from self.cleaned_data here
return testname
def clean_genome_pos(self):
test_name = self.cleaned_data['genome_pos']
# validate genome_pos, raise ValidationError if necessary.
# you can't access any other fields from self.cleaned_data here
return genom_post
def clean(self):
cleaned_data = super(SingleInput, self).clean()
# you need to handle case when the fields do not exist in cleaned_data
testname = cleaned_data.get('testname')
genome_pos = cleaned_data.get('genome_pos')
if testname and genome_pos:
# do any checks that rely on testname *and* genome_pos, and
# raise validation errors if necessary
...
return cleaned_data
您的另一種選擇是使用RegexField
而不是自定義清理方法。
class SingleInput(forms.Form):
testname = forms.RegexField(
label='testname',
max_length=100,
regex=r"^\w+$",
message="<error message>",
)
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.