#django #django-models
#django #django-модели
Вопрос:
Я хочу добавить дополнительный подкласс в мое CharField.
Это будет выглядеть так:
first_row = models.CharField('General', extra_subclass="data", help_text='q122', max_length=30, blank=True, null=False)
Код, который я пробовал и потерпел неудачу:
class extra_subclass(models.CharField):
def __init__(self, *args, **kwargs):
self.kwargs['extra_subclass']
super(extra_subclass, self).__init__(*args, **kwargs)
Вторая попытка:
class extra_subclass(models.CharField):
def __init__(self, *args, **kwargs):
self.kwargs['extra_subclass']= ' '
super(extra_subclass, self).__init__(*args, **kwargs)
class User1(models.Model):
first_row = extra_subclass('General', extra_subclass='hi', help_text='q122', max_length=30, blank=True, null=False)
Ошибка:
AttributeError: 'extra_subclass' object has no attribute 'kwargs'
Комментарии:
1. Это не то, как вы работаете с подклассом. Обычно вы подклассируете поле, so
class MySubCharField(models.CharField): ...
, а затем используете его какfirst_row = MySubCharField(...)
.2. @WillemVanOnsem, я отредактировал и добавил свою вторую попытку к своему вопросу. Это было то, что я понял из вашего комментария. Не могли бы вы уточнить это для меня с полным кодом для решения? PS Я все еще новичок в Django.
Ответ №1:
Вы можете определить свое новое поле для заполнения значений по умолчанию, если они не были заданы. kwargs
это место, dict
где ключи и значения могут быть добавлены или удалены перед передачей его CharField.__init__()
(вызывается как super().__init__()
в данном случае). Я использовал метод dict.setdefault()
в этом примере.
Может быть, так:
class ExtraCharField(models.CharField):
def __init__(self, *args, **kwargs):
# remove from kwargs, because 'super().__init__()'
# will not accept that argument
extra_arg = kwargs.pop('extra_arg', None)
# set some default values if they where not provided
kwargs.setdefault('max_length', 30)
kwargs.setdefault('null', False)
kwargs.setdefault('blank', True)
kwargs.setdefault('verbose_name', 'General')
kwargs.setdefault('help_text', 'q122')
super().__init__(*args, **kwargs)
# add as an instance attribute after 'super().__init__()'
self.extra_arg = extra_arg
А затем используйте это, чтобы добавить поле в вашу модель:
class User1(models.Model):
first_row = ExtraCharField(extra_arg='something else')
second_row = ExtraCharField(max_length=40)
third_row = ExtraCharField(verbose_name='something')
fourth_row = ExtraCharField(max_length=10, extra_arg=1234)
Комментарии:
1. Как насчет аргумента extra_subclass? Вы можете видеть, что я упомянул об этом в своем коде. Я ищу добавление аргумента extra_subclass в мое поле. Все было бы так же, как CharField, но с extra_subclass «add-on».