Найти - Пользователи
Полная версия: Пример пользовательского типа не работает
Начало » Django » Пример пользовательского типа не работает
1
Nick2009
Вот по этой доке

http://docs.djangoproject.com/en/dev/howto/custom-model-fields/#howto-custom-model-fields

создал такой пользовательский тип
class FixCharField(models.Field):
def __init__(self, max_length, *args, **kwargs):
self.max_length = max_length
super(FixCharField, self).__init__(*args, **kwargs)
def db_type(self):
return 'char(%s)' % self.max_length
Использую так
fieldname = FixCharField(8)
В SQL получаю
fieldname char(None)
Если изменить s на d
    return 'char(%d)' % self.max_length
То получаю ошибку
TypeError: int argument required

Если делать явное присвоение целого числа, то ошибка всё равно остается.
  def __init__(self, max_length, *args, **kwargs):
self.max_length = 8 #max_length
Разве self.max_length не integer?

И такой вариант не работает! Выдает char(None)
class FixCharField(models.Field):
def __init__(self, max_length, *args, **kwargs):
self.max_length = '10' #max_length
super(FixCharField, self).__init__(*args, **kwargs)
def db_type(self):
return 'char(%s)' % self.max_length
Жесть! :(
Nick2009
Пока, решил задачу таким образом
class FixCharField(models.CharField):
def __init__(self, *args, **kwargs):
super(FixCharField, self).__init__(*args, **kwargs)
def db_type(self):
return "char(%s)" % self.max_length
field=FixCharField(max_length=8)
Выходит, не каждому примеру в этой доке можно верить…
vvp91
Вот пример из пакета django.db.models.fields:
class EmailField(CharField):
def __init__(self, *args, **kwargs):
kwargs['max_length'] = kwargs.get('max_length', 75)
CharField.__init__(self, *args, **kwargs)
Если разработчик при создании поля EmailFields не задаст размер явно, то размер будет установлен в конструкторе поля.
Соответственно, ваш код может быть таким:
class FixCharField(models.Field):
def __init__(self, max_length, *args, **kwargs):
kwargs['max_length'] = 10
super(FixCharField, self).__init__(*args, **kwargs)
def db_type(self):
return 'char(%s)' % self.max_length
Или таким:
class FixCharField(models.Field):
def __init__(self, max_length, *args, **kwargs):
super(FixCharField, self).__init__(*args, **kwargs)
self.max_length = 10
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB