Я не думаю, что вам нужен собственный виджет (вам все еще нужен TextInput), вам нужно пользовательское Поле . Для этого вы должны создать подкласс django.forms.Field
. К сожалению, по этой теме недостаточно документации:
Если встроенные классы полей не соответствуют вашим потребностям, вы можете легко создавать собственные классы полей. Для этого просто создайте подкласс django.forms.Field. Его единственные требования - чтобы он реализовал метод clean () и чтобы его метод init () принимал основные аргументы, упомянутые выше (обязательно, label, initial, widget, help_text).
Я нашел это сообщение в блоге , которое более подробно охватывает как пользовательские виджеты, так и поля. Автор не согласен с документацией, которую я цитировал выше - ее стоит перечитать.
Для вашей конкретной ситуации вы бы сделали что-то вроде этого (не проверено):
class MyTagField(forms.Field):
default_error_messages = {
'some_error': _(u'This is a message re: the somr_error!'),
}
def to_python(self, value):
# put code here to coerce 'value' (raw data from your TextInput)
# into the form your code will want (a list of Tag objects, perhaps)
def validate(self, value):
if <not valid for some reason>:
raise ValidationError(self.error_messages['some_error'])
Тогда в вашей ModelForm:
class PostModelFormNormalUser(forms.ModelForm):
tag = MyTagField()
class Meta:
model = Post
exclude = ('user', 'created', 'modified')
def __init__(self, *args, **kwargs):
super(PostModelFormNormalUser, self).__init__(*args, **kwargs)
self.fields['tag'].help_text = None