27.07.2009 21:41

  1. Нашел у 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
    получил следующее:
    [pre]
    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)
    [/pre]

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

    Help me, plz!
  2. Эм... ошибка была как всегда в ДНК )))

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


    вместо

    
    from fields import SeparatedValuesField
    class Test(models.Model):
        fld = SeparatedValuesField()
    


    Все. Тему можно считать закрытой )

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