python - 如何使子类化的自定义 Django 表单字段成为非必需字段?

标签 python django forms required subclass

Django 文档 ( http://docs.djangoproject.com/en/dev/ref/forms/fields/ ) 说你可以创建 django.forms.Field 的子类,只要它实现 clean() 方法并且它的 init() 方法接受核心参数(必需、标签、首字母、小部件、help_text)。

我尝试使用以下 Django 代码片段中的代码: http://djangosnippets.org/snippets/907/ 实现信用卡字段,但我希望它不是必需的。设置 required=false 对于普通字段来说效果很好,但对于此代码片段中的子类字段则不起作用。片段缺少什么? (我认为这是 init() 方法丢失或不接受 Django 文档中提到的核心参数,但我不知道如何解决这个问题。)

例如,在这些自定义字段上将 required 设置为 false,表单仍然需要它们:

CC_number = CreditCardField(required=False)
CC_expiration_date = CCExpField(required=False)

表单不需要此字段(它按预期工作):

CC_security_code = forms.IntegerField(required=False)

感谢您的帮助!

最佳答案

通过修改 CreditCardField 中的 clean 方法(方法的前 2 行),这应该可以工作:

def clean(self, value):
    if not value and not self.required:
        return value
    """Check if given CC number is valid and one of the
       card types we accept"""
    if value and (len(value) < 13 or len(value) > 16):
        raise forms.ValidationError("Please enter in a valid "+\
                "credit card number.")
    elif self.get_cc_type(value) not in ("Visa", "MasterCard",
                                             "American Express"):
        raise forms.ValidationError("Please enter in a Visa, "+\
            "Master Card, or American Express credit card number.")
    return super(CreditCardField, self).clean(value)

关于python - 如何使子类化的自定义 Django 表单字段成为非必需字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5749966/

相关文章:

html - Django:将 SESSION 值发送到可扩展的 html 模板

javascript - 当转到另一个表单并再次返回时保留表单中的数据

PHP 添加字符到 jQuery.AJAX 发布的字符串

python - 将列添加到包含跨行的复杂逻辑的 Python pandas 数据框中

python - 将文件的行转换为 numpy 数组

django - 如何删除外键集?

python - Django 如何停止函数的执行

jQuery 匹配模式

python - 如果列表中的任何字符串匹配正则表达式

python - Pandas DataFrame 中的行值到列数组