django namedtuple没有返回值

时间:2014-10-29 22:59:29

标签: python django namedtuple

我花了很多时间试图找出以下代码无法正常工作的原因。我搜索过SO,Python docs&谷歌和阅读django文档,但我仍然无法解决为什么它不起作用。

基本上,我有一个名为tuple,用于存储必需的字段数据。然后,我希望在将条目保存/更新到数据库之前,调用命名元组来清除表单中的数据。

例如,当用户选择的address_type为6时,LocalityDisplay为False。然后在表单的验证中, if atype_config.LocalityDisplay == False:应该被触发,并且应该删除address_locality中的值,这意味着不应该为数据库保存任何vaule address_locality 即可。我使用返回value.strip()其他在我的forms.py中,它运行良好。

我不确定我是否在对命名元组进行编码时出现了根本性错误,导致命名元组无法正确编制索引,或者我是否编码 if atype_config.LocalityDisplay == False:条件不正确或者做了一些我看不到的错误。

没有显示错误,如果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,但没有解决问题,所以我不确定代码无效的原因是什么。

1 个答案:

答案 0 :(得分:1)

这似乎与您的namedtuple无关。如果您按照评论中的建议添加了一些日志记录,那么您已经能够看到。问题完全在if语句中,代码完全没有意义。

首先,正如您在其他问题中详细解释的那样,strip并没有做出您认为合适的事情。它返回从末端剥离的空格的值。如果您希望clean函数返回None,则只返回None,不要使用strip。

其次,更重要的是,在另一个方法内的if语句中定义一个函数是完全没有意义的。 Django对你的新方法一无所知,你不能从外部调用另一个函数中定义的函数,即使你可以在它完成时使用clean_fieldname函数完成Django调用主clean方法。

但无论如何,这一切都毫无意义;您已经可以访问cleaned_data方法中的clean字典了,那么为什么不简单地删除那里的元素呢?

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