Как отправить дополнительные данные в шаблон, когда Django ValidationError произошла в определенном поле?

Скажем, у меня есть форма Django — XYZ, в которой есть поля A, B, C. Поле B — это поле имени пользователя, когда определенное имя пользователя уже существует, возникает ошибка проверки и выдается сообщение. Наряду с этим я хочу отправить в шаблон автоматически предложенное имя пользователя. Насколько я понимаю, я могу отправлять только как ошибки поля и ошибки без поля.

def clean_B(self):
        B = self.cleaned_data['B']
        if address.objects.filter(B=B).exists():
            raise forms.ValidationError("Username already exists")
        return B

Я попытался добавить еще одну ошибку, используя Form.add_error(), и Django не допускает нескольких ошибок в одном словаре для каждого поля или ошибок Non_field.

Как я могу это сделать?

Спасибо!


person Satish V Madala    schedule 13.02.2016    source источник
comment
Почему вы не можете добавить это в сообщение для текущего ValidationError? Вы можете делать что угодно с cleaned_data, чтобы генерировать предложения, и делать: raise forms.ValidationError("Username already exists, please try foo, bar or baz instead").   -  person Shang Wang    schedule 14.02.2016
comment
Я хотел бы сделать его более удобным для пользователя (что-то вроде Gmail Auto Suggest). Пользователи могут просто нажать на foo/bar, чтобы его можно было заполнить в поле имени пользователя!! Сообщение об ошибке другое, и предложения разные!! Для этого мне нужны автоматические предложения в списке.   -  person Satish V Madala    schedule 14.02.2016


Ответы (1)


Я думаю, вы можете использовать django messages framework, чтобы показать свое сообщение с предложениями пользователю.

from django.contrib import messages

...

def clean_B(self):
    B = self.cleaned_data['B']
    if address.objects.filter(B=B).exists():
        # In __init__ method of the form, you should store request as property
        messages.info(self.request, 'You should use another username, i.e. John')
        raise forms.ValidationError('Username already exists')
    return B

А затем где-то в вашем шаблоне выведите сообщение:

{% if messages %}
<ul class="messages">
    {% for message in messages %}
    <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
    {% endfor %}
</ul>
{% endif %}
person Dmitry Astrikov    schedule 14.02.2016
comment
Привет Astrikov, спасибо за ответ, имеет смысл использовать сообщения здесь. Но не удалось получить данные запроса в функцию clean_B. и Является ли это хорошей практикой, доступной в этом сценарии. Ошибка: AttributeError: объект «XYZCreateForm» не имеет атрибута «запрос». - person Satish V Madala; 14.02.2016
comment
Как я уже сказал, вы должны передать request вашему form kwargs и сохранить его как свойство в вашем методе __init__. - person Dmitry Astrikov; 15.02.2016
comment
Привет Астриков, хотя ваше предложение решает основную проблему: я не могу отправить dict/json доступных имен пользователей в сообщении, сообщение просто преобразуется в строку! Мне нужно выполнить некоторую интерактивную функцию на стороне шаблона, это возможно только в том случае, если сообщение dict/json. При использовании ast.literal_eval() выдает несколько сумасшедших ошибок. Есть ли способ напрямую отправить json или dict в шаблон как сообщение или ошибку? - person Satish V Madala; 16.02.2016