2014-10-29 50 views
1

我花了很多时间试图找出为什么下面的代码不正常工作。我搜索了SO,Python文档& Google,并阅读了django文档,但我仍然无法弄清楚为什么它不起作用。django namedtuple不返回值

基本上,我有一个存储所需字段数据的命名元组。然后,我想调用指定的元组来清除表单中的数据,然后将条目保存/更新到数据库。

例如,当用户选择的address_type为6时,LocalityDisplay为False。然后在表单的验证中,如果atype_config.LocalityDisplay == False:应该被触发,并且address_locality中的值应该被移除,这意味着没有值应该被保存到数据库的address_locality。我已经使用返回value.strip()其他在我的forms.py中,它运作良好。

我不确定我是否已经在编码命名的元组造成命名元组做了一个根本性的错误不能被正确索引,或者如果我已经编写了如果atype_config.LocalityDisplay ==错误:错误条件或取得了一些其他错误我看不到。

没有显示错误,如果atype_config.LocalityDisplay == False:显示没有被触发/到达。

这里是我的代码:

forms.py

from collections import namedtuple 

RequiredFields = namedtuple('RequiredFields', ['LocalityDisplay', 'LocalityRequired', 'RegionDisplay', 'RegionRequired', 'PostcodeDisplay', 'PostcodeRequired']) 

........... (do some stuff here) 

class AddressDetailsForm(forms.ModelForm): 

........... (do some stuff here) 

REQUIRED_FIELDS = { 
    0: RequiredFields(LocalityDisplay=True, LocalityRequired=False, RegionDisplay=True, RegionRequired=False, PostcodeDisplay=True, PostcodeRequired=False), 
    1: RequiredFields(LocalityDisplay=False, LocalityRequired=False, RegionDisplay=True, RegionRequired=True, PostcodeDisplay=True, PostcodeRequired=True), 
    2: RequiredFields(LocalityDisplay=True, LocalityRequired=True, RegionDisplay=False, RegionRequired=False, PostcodeDisplay=True, PostcodeRequired=True), 
    3: RequiredFields(LocalityDisplay=True, LocalityRequired=True, RegionDisplay=False, RegionRequired=False, PostcodeDisplay=True, PostcodeRequired=True), 
    4: RequiredFields(LocalityDisplay=True, LocalityRequired=True, RegionDisplay=False, RegionRequired=False, PostcodeDisplay=True, PostcodeRequired=True), 
    5: RequiredFields(LocalityDisplay=True, LocalityRequired=True, RegionDisplay=True, RegionRequired=True, PostcodeDisplay=True, PostcodeRequired=True), 
    6: RequiredFields(LocalityDisplay=False, LocalityRequired=False, RegionDisplay=True, RegionRequired=True, PostcodeDisplay=True, PostcodeRequired=True), 
    ........... (culled for brevity) 
    285: RequiredFields(LocalityDisplay=True, LocalityRequired=True, RegionDisplay=False, RegionRequired=False, PostcodeDisplay=False, PostcodeRequired=False) 
} 

........... (do some stuff here) 

cd_addf = super(AddressDetailsForm, self).clean() 
    address_type = cd_addf.get('address_country_style_type', None) 
    if address_type is None: 
     # Prior validation will spot this 
     pass 
    elif address_type == 0: 
     self._errors['address_country_style_type'] = self.error_class([_("You must select an Address Format.")]) 
    else: 
     atype_config = REQUIRED_FIELDS[address_type] 

     ........... (do some stuff here) 

     if atype_config.LocalityDisplay == False: 
      def clean_address_locality(self): 
       value = self.cleaned_data['address_locality'] 
       return value.strip() 

     ........... (do some stuff here) 

    return cd_addf 

我问一个相关的问题here,但并没有解决问题,所以我不知道是什么原因延误?代码不起作用。

+0

你确定'''address_type'''不是'''''''''''''''''''''''''''''''''''''' – schillingt 2014-10-30 00:33:51

+0

schillingt,我通过删除if else条件并只有if atype_config.LocalityDisplay == False:条件来查看该条。问题仍然存在。 – user1261774 2014-10-30 00:49:33

+0

您是否尝试添加一些日志记录以查看执行的执行情况与预期不符? – 2014-10-30 03:35:07

回答

1

这似乎与您的namedtuple没有任何关系。如果您按照评论中的建议添加了一些日志记录,那么您可以看到这一点。问题完全在于如果声明,代码根本没有意义。

首先,正如你在其他问题中详细解释的那样,strip不会做你认为它确实会做的事情。它返回的值是空白空白。如果你想让你的clean函数返回None,那么只需返回None,不要使用strip。其次,更重要的是,在另一个方法内的if语句中定义一个函数是完全没有意义的。 Django无法知道任何有关新方法的信息,您无法从外部调用另一个函数中定义的函数,即使Django在调用主要的clean方法时已经完成了clean_fieldname函数。

但是在任何情况下都是毫无意义的;您可以访问clean方法中的cleaned_data字典,那么为什么不简单地删除那里的元素呢?

if not atype_config.LocalityDisplay: 
    self.cleaned_data.pop('address_locality', None)