Добавить новый подкласс в CharField

#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».