簡體   English   中英

Django self.cleaned_data問題。

[英]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方法中的testnamegenome_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM