Вкратце : add_form
используется, когда вы создаете новый CustomUser
, тогда как простой form
используется для изменения данных. для существующего объекта CustomerUser
.
Класс UserAdmin
переопределяет метод get_form(..)
, как мы видим в исходном коде [GitHub] :
blockquote>def get_form(self, request, obj=None, **kwargs): """ Use special form during user creation """ defaults = {} if obj is None: defaults['form'] = self.add_form defaults.update(kwargs) return super().get_form(request, obj, **defaults)
Теперь сам
get_form
классаModelAdmin
(суперклассUserAdmin
) вызываетmodelform_factory(..)
со словарем атрибутов, как мы видим в [1120 ] исходный код [GitHub] :blockquote>def get_form(self, request, obj=None, change=False, **kwargs): # ... defaults = { 'form': form, 'fields': fields, 'exclude': exclude, 'formfield_callback': partial(self.formfield_for_dbfield, request=request), **kwargs, } if defaults['fields'] is None and not modelform_defines_fields(defaults['form']): defaults['fields'] = forms.ALL_FIELDS try: return modelform_factory(self.model, **defaults) except FieldError as e: raise FieldError( '%s. Check fields/fieldsets/exclude attributes of class %s.' % (e, self.__class__.__name__) )
Этот словарь обновляется параметрами, которые передаются как именованные аргументы. Так и с
form=self.add_form
. Таким образом, это приводит к использованию другой формы :add_form
.Это может быть полезно, если, например, мы хотим иметь возможность обновлять определенные поля только тогда, когда мы обновляем a
CustomUser
.Обратите внимание, что только
UserAdmin
имеет такое переопределениеget_form
, а самModelAdmin
не имеетadd_form
, насколько мне известно, и, таким образом, указание такого атрибута не будет иметь значения . [+1132]
Необходимо использовать виджет HTML, который расширяет стандартный виджет Маркировки и добавляет поддержку интерпретации HTML-тэгов.
Посмотрите JavaDoc.
Я использовал бы CSS для моделирования маркировки, чтобы оснастить данный и отбросить <br/>
все вместе.