代码之家  ›  专栏  ›  技术社区  ›  Escher

为什么是我的形式。当我尝试在表单中访问时,清理的数据不同。clean_field方法?

  •  0
  • Escher  · 技术社区  · 8 年前

    我的表单中的数据清理有问题。在我的单个字段清理方法中调用调试器时,清理后的版本中有一半数据丢失。下面是代码的简化版本:

    class MealForm(forms.Form):
        def __init__(self, *args, **kwargs):
            # call super(), do some stuff, then declare some fields:
            self.fields['meal'] = forms.CharField(required=True, max_length=255)
            self.fields['sugar'] = forms.CharField(required=False, max_length=255)
            self.fields['salt'] = forms.CharField(required=False, max_length=255)
    
        def clean_meal(self):
            pdb.set_trace() # insert a breakpoint to inspect self.cleaned_data.keys() and self.data.keys()
            meal_value = self.cleaned_data['meal']
            # dict of all the various utility functions because python doesn't have 'switch'
            process_meal_type = {
                'dessert': self.process_sugar,
                'main course': self.process_salt,
            }
            try:
                process_meal_type[meal_value]()
            except KeyError:
                raise forms.ValidationError( "Incorrect meal type: " + str(meal_value) )
            return meal_value
    
       def process_sugar(self):
           if not self.cleaned_data.get('sugar'):
               raise ValidationError ( "Desserts must contain sugar")
           else:
               do_something_with_the_sugar_data()
    

    如果我发表评论 clean_meal 并在 clean ,我注意到 self.cleaned_data 如预期的那样:所有表单字段都存在并已入账。我不是给个人打电话 clean_* 方法。

    发生什么事?

    1 回复  |  直到 8 年前
        1
  •  2
  •   Daniel Roseman    8 年前

    因为各个字段清理方法提供了要填充的数据 cleaned_data -这就是他们的目的。因此,您无法访问尚未调用干净方法的字段的数据。