1. Larin Anatoly

    27.07.2009

    0 ↑
    0 ↓
    Нашел у David Cramer код кастомного поля, практически подходящего мне по задаче:
    from django.db import models

    class SeparatedValuesField(models.TextField):
    __metaclass__ = models.SubfieldBase

    def __init__(self, *args, **kwargs):
    self.token = kwargs.pop('token', ',')
    super(SeparatedValuesField, self).__init__(*args, **kwargs)

    def to_python(self, value):
    if not value: return
    if isinstance(value, list):
    return value
    return value.split(self.token)

    def get_db_prep_value(self, value):
    if not value: return
    assert(isinstance(value, list) or isinstance(value, tuple))
    return self.token.join([unicode(s) for s in value])

    def value_to_string(self, obj):
    value = self._get_val_from_obj(obj)
    return self.get_db_prep_value(value)
    Полностью скопировал пример и после выполнения: python manage.py validate
    получил следующее:
    Traceback (most recent call last):
    File "manage.py", line 11, in <module>
    execute_manager(settings)
    File "c:\Python25\Lib\site-packages\django\core\management\__init__.py", line
    340, in execute_manager
    utility.execute()
    File "c:\Python25\Lib\site-packages\django\core\management\__init__.py", line
    295, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
    File "c:\Python25\Lib\site-packages\django\core\management\base.py", line 192,
    in run_from_argv
    self.execute(*args, **options.__dict__)
    File "c:\Python25\Lib\site-packages\django\core\management\base.py", line 219,
    in execute
    output = self.handle(*args, **options)
    File "c:\Python25\Lib\site-packages\django\core\management\base.py", line 348,
    in handle
    return self.handle_noargs(**options)
    File "c:\Python25\Lib\site-packages\django\core\management\commands\validate.p
    y", line 9, in handle_noargs
    self.validate(display_num_errors=True)
    File "c:\Python25\Lib\site-packages\django\core\management\base.py", line 246,
    in validate
    num_errors = get_validation_errors(s, app)
    File "c:\Python25\Lib\site-packages\django\core\management\validation.py", lin
    e 28, in get_validation_errors
    for (app_name, error) in get_app_errors().items():
    File "c:\Python25\Lib\site-packages\django\db\models\loading.py", line 128, in
    get_app_errors
    self._populate()
    File "c:\Python25\Lib\site-packages\django\db\models\loading.py", line 57, in
    _populate
    self.load_app(app_name, True)
    File "c:\Python25\Lib\site-packages\django\db\models\loading.py", line 72, in
    load_app
    mod = __import__(app_name, {}, {}, ['models'])
    File "C:\django_projects\dj_mmorpg\game\models.py", line 119, in <module>
    class Test(models.Model):
    File "c:\Python25\Lib\site-packages\django\db\models\base.py", line 80, in __n
    ew__
    new_class.add_to_class(obj_name, obj)
    File "c:\Python25\Lib\site-packages\django\db\models\base.py", line 164, in ad
    d_to_class
    value.contribute_to_class(cls, name)
    TypeError: Error when calling the metaclass bases
    unbound method contribute_to_class() must be called with SeparatedValuesFiel
    d instance as first argument (got ModelBase instance instead)


    Уже несколько раз перечитал документацию, но так и не понял в чем проблема...

    Help me, plz!
  2. Larin Anatoly

    27.07.2009

    0 ↑
    0 ↓
    Эм... ошибка была как всегда в ДНК )))

    Совсем заработался, пытался сделать так:
    class Test(models.Model):
    from fields import SeparatedValuesField
    fld = SeparatedValuesField()


    вместо
    from fields import SeparatedValuesField
    class Test(models.Model):
    fld = SeparatedValuesField()
    Все. Тему можно считать закрытой )

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.