Django Forms переводит стандартное сообщение об ошибке
Все мои переводы работают, кроме сообщений об ошибках, генерируемых формами.
Это начало моей формы:
class MyForm(forms.Form):
first_name = forms.CharField(label=_("First name"), min_length=3, required=True)
Теперь метка "First name" прекрасно переводится в "Vorname", потому что я сделал .po файл и скомпилировал и т.д.
Однако при вводе только 2 символов ошибка возникает на английском, а не на (в данном случае) немецком языке, см. распечатку экрана ниже.
Я посмотрел в Github Django репозиторий django/conf/locale/de etc. но не смог найти там строку "Please lengthen etc.".
Итак, мой вопрос: как мне заставить перевести это сообщение об ошибке? Я предполагаю, что у Django есть стандартный метод и что эта строка уже находится в каком-то .po файле где-то в проекте Django?
Добавление атрибута oninvalid
к виджету этого поля будет работать.
class MyForm(forms.Form):
first_name = forms.CharField(label=_("First name"), min_length=3, required=True)
def __init__(self, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
self.fields['first_name'].widget.attrs={
'oninvalid':"this.setCustomValidity('{German stuff}')",
'oninput':"this.setCustomValidity('')"
}
Редактирование 1
Я также узнал, что необходимо добавить oninput
, который затем очищает сообщение. Я ищу другие способы, потому что это решение всегда будет показывать одно и то же сообщение, независимо от ошибки проверки - пусто или меньше 3 символов = тот же msg
Редактирование 2
Для этого требуется дополнительный javascript, но его нужно сделать только один раз.
Может быть больше сообщений об ошибках, я тестировал это только на Select
.
references = https://developer.mozilla.org/en-US/docs/Learn/Forms/Form_validation#validating_forms_using_javascript
form.py
class MyForm(forms.Form):
first_name = forms.CharField(label=_("First name"), min_length=3, required=True)
def __init__(self, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
self.fields['first_name'].widget.attrs={
'oninvalid':"germanValidationMsg(this)",
'oninput':"this.setCustomValidity('')"
}
germanvalidation.js
function germanValidationMsg(e){
// dictionary of validations and their status
console.log(e.validity)
if (e.validity['badInput']){
e.setCustomValidity('German badInput Msg');
} else if (e.validity['patternMismatch']){
e.setCustomValidity('German patternMismatch Msg');
} else if (e.validity['rangeOverflow']){
e.setCustomValidity('German rangeOverflow Msg');
} else if (e.validity['rangeUnderflow']){
e.setCustomValidity('German rangeUnderflow Msg');
} else if (e.validity['stepMismatch']){
e.setCustomValidity('German stepMismatch Msg');
} else if (e.validity['tooLong']){
e.setCustomValidity('German tooLong Msg');
} else if (e.validity['tooShort']){
e.setCustomValidity('German tooShort Msg');
} else if (e.validity['typeMismatch']){
e.setCustomValidity('German typeMismatch Msg');
} else if (e.validity['valueMissing']){
e.setCustomValidity('German valueMissing Msg');
//} else if (e.validity['customError']){
// // customError always seems to be true?
// e.setCustomValidity('German customError Msg');
} else if (e.validity['valid']){
e.setCustomValidity('');
};
};