Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django自定义模型字段-获取一个;属性名称必须为字符串;错误_Python_Django - Fatal编程技术网

Python Django自定义模型字段-获取一个;属性名称必须为字符串;错误

Python Django自定义模型字段-获取一个;属性名称必须为字符串;错误,python,django,Python,Django,因此,我创建了一个扩展CharField的定制ModelField,以获得更好的空字符串验证,并允许我对其运行定制业务逻辑验证和清理。代码如下: class CustomTextField(models.CharField): 10 def __init__(self, *args, rule="TextRule", **kwargs): 11 self.rule = rule 12 super().__init__(args, kwargs)

因此,我创建了一个扩展CharField的定制ModelField,以获得更好的空字符串验证,并允许我对其运行定制业务逻辑验证和清理。代码如下:

 class CustomTextField(models.CharField):
 10     def __init__(self, *args, rule="TextRule", **kwargs):
 11         self.rule = rule
 12         super().__init__(args, kwargs)
 13
 14     def deconstruct(self):
 15         name, path, args, kwargs = super().deconstruct()
 16         # Only include kwarg if it's not the default
 17         if self.rule != "TextRule":
 18             kwargs['rule'] = self.rule
 19         return name, path, args, kwargs
 20
 21     def validate(self, value, model_instance):
 22         super().validate(value, model_instance)
 23         # skip special cases here
 24         if self.blank and self.rule == TextRule:
 25             return
 26         rule_module = __import__("webapp.rules", fromlist=['blah'])
 27         class_ = getattr(rule_module, self.rule)
 28         rule = class_(value)
 29         result = rule.validate()
 30         if result != "":
 31             raise ValidationError(result)
 32
 33     def clean(self, value, model_instance):
 34         value = super().clean(value, model_instance)
 35         rule_module = __import__("webapp.rules", fromlist=['blah'])
 36         class_ = getattr(rule_module, self.rule)
 37         rule = class_(value)
 38         return rule.clean()

其思想是,它基本上是一个CharField,默认情况下运行我的TextRule对象,但可以被重写以运行其他文本类型规则(例如电话号码、电子邮件等),以执行自定义验证和数据清理

但每当我将此字段指定给模型属性时,会覆盖规则:

zip_code = CustomTextField(rule="ZipCodeRule", max_length=5)
django服务器不断向我发送以下消息:

 File "/home/blah/python37env/lib/python3.7/site-packages/django/db/models/base.py", line 156, in __new__
    new_class.add_to_class(obj_name, obj)
  File "/home/blah/python37env/lib/python3.7/site-packages/django/db/models/base.py", line 321, in add_to_class
    value.contribute_to_class(cls, name)
  File "/home/blah/python37env/lib/python3.7/site-packages/django/db/models/fields/__init__.py", line 743, in contribute_to_class
    if not getattr(cls, self.attname, None):
 TypeError: getattr(): attribute name must be string

当我尝试运行makemigrations时也会发生同样的情况。因为错误中引用的django源代码不容易理解,所以现在完全被难住了。

至少,您的超级调用是错误的:它应该是
super()。\uuu init\uuu(*args,**kwargs)
(带星号)。非常感谢您,@Daniel Roseman,解决了这个问题。:)除了不熟悉Django之外,我对Python更高级的特性(如解包)也有点陌生。