python - Django South 忽略我的自定义规则

标签 python django django-south

我正在使用自定义 Django 模型字段和小部件在我的管理员中呈现 GoogleMap 小部件,我还想在我的项目中使用 South 来处理数据库迁移。然而,经过一番努力,我无法生成适合的自定义南方规则,这是我的自定义模型,也是我尝试过的许多内省(introspection)规则中的最后一个。

class GoogleMapMarkerField(models.CharField):
    __metaclass__ = models.SubfieldBase
    description = _('Un marcador de Google Maps')
    widget = GoogleMapMarkerWidget

    def __init__(self, center, *args, **kwargs):
        kwargs['max_length'] = 100
        kwargs['help_text'] = _('Arrastre el cursor en el mapa para seleccionar el punto')
        self.center = center

        super(GoogleMapMarkerField, self).__init__(*args, **kwargs)

    def formfield(self, **kwargs):
        defaults = {
            'center': self.center,
            'form_class':GoogleMapMarkerFormField
        }
        defaults.update(kwargs)
        return super(GoogleMapMarkerField, self).formfield(**defaults)

    def to_python(self, value):
        if isinstance(value, GoogleMapMarker):
            return value
        if isinstance(value, list):
            return GoogleMapMarker(*map(float, value))

        elif isinstance(value, basestring):
            try:
                return GoogleMapMarker(*map(float, value.split(',')))
            except ValueError:
                pass

    def get_prep_value(self, value):
        return '%f,%f' % (value.latitude, value.longitude)


add_introspection_rules([
            (
                (GoogleMapMarkerField, ),
            [],
            {
                'center': ('center', {}),
            }
            )

    ],  ["^website\.fields\.GoogleMapMarkerField"])

这是我得到的回溯

Traceback (most recent call last):
  File "manage.py", line 14, in <module>
    execute_manager(settings)
  File "/home/armonge/workspace/env/lib/python2.7/site-packages/django/core/management/__init__.py", line 438, in execute_manager
    utility.execute()
  File "/home/armonge/workspace/env/lib/python2.7/site-packages/django/core/management/__init__.py", line 379, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/armonge/workspace/env/lib/python2.7/site-packages/django/core/management/base.py", line 191, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/home/armonge/workspace/env/lib/python2.7/site-packages/django/core/management/base.py", line 220, in execute
    output = self.handle(*args, **options)
  File "/home/armonge/workspace/env/lib/python2.7/site-packages/south/management/commands/schemamigration.py", line 97, in handle
    old_orm = last_migration.orm(),
  File "/home/armonge/workspace/env/lib/python2.7/site-packages/south/utils.py", line 62, in method
    value = function(self)
  File "/home/armonge/workspace/env/lib/python2.7/site-packages/south/migration/base.py", line 422, in orm
    return FakeORM(self.migration_class(), self.app_label())
  File "/home/armonge/workspace/env/lib/python2.7/site-packages/south/orm.py", line 46, in FakeORM
    _orm_cache[args] = _FakeORM(*args)  
  File "/home/armonge/workspace/env/lib/python2.7/site-packages/south/orm.py", line 125, in __init__
    self.models[name] = self.make_model(app_label, model_name, data)
  File "/home/armonge/workspace/env/lib/python2.7/site-packages/south/orm.py", line 321, in make_model
    field = self.eval_in_context(code, app, extra_imports)
  File "/home/armonge/workspace/env/lib/python2.7/site-packages/south/orm.py", line 236, in eval_in_context
    return eval(code, globals(), fake_locals)
  File "<string>", line 1, in <module>
TypeError: __init__() takes at least 2 arguments (1 given)

最佳答案

center 不是关键字参数,而是位置参数。你不应该对 South 使用位置参数,它不理解它们。 (参见Custom Fields: Keyword Arguments)。您可以通过为 center 提供默认值( center=None 就可以了)来解决此问题,然后按照链接中的示例代码定义传递给 __init__ 的关键字名称>、存储在数据库中的名称以及选项字典(可能为空,但设置默认值也有帮助)。

关于python - Django South 忽略我的自定义规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7295030/

相关文章:

python - 在字符串列表中提取和连接标题

python - Django 为什么权限代号与检查是否有权限不同?

django 测试 response.request.user.is_authenticated() 在注销后返回 True

python - 使用 SciPy 积分本身涉及积分的函数

python 3.7 对cosmos db的异步http请求

python - 如何使用 PUT 方法编辑序列化数据

django - 南迁移文件是否应添加到源代码管理中?

django schemamigration 创建相同的迁移更改

数据迁移中的 Django & South : Custom field methods are not executed when doing obj. save()

python - 按最近 3 个月和 ID 过滤数据