2015-11-26 5 views
1

Я пытаюсь вывести сообщение об ошибке в свой html. Я попытался использовать совет по другим вопросам, но я все еще получаю ошибку на экране трассировки, а не на html. Может кто-нибудь помочь?Как вы передаете ошибку проверки в html?

мой взгляд:

def add_user_institution_accounts(request): 
    context_object_name = 'variable_used_in `add_user_accounts.html`' 
    form = AddUserAccountsForm 
    template_name = 'add_user_accounts.html' 

    if request.method == 'POST': 
     # create a form instance and populate it with data from the request: 
     form = AddUserAccountsForm(request.POST) 
     # check whether it's valid: 
     if form.is_valid(): 
      Institution = Institution.objects.get(name=form.cleaned_data['name']) 
      new_entry = User.objects.get(id=request.user.id) 
      if Account.objects.filter(user=new_entry, institution=Institution.type).exists(): 
       raise forms.ValidationError(_('This account already exists'), code='invalid') 
      else: 
       Account.objects.create(user=new_entry, institution = Institution.type) 
      return HttpResponseRedirect('') 
     else: 
      messages.error(request, "Error") 

    return render(request, 'add_user_accounts.html', 
     {'form': form}, 
     {'form_errors': form_errors}, 
     context_instance=RequestContext(request)) 

Мой HTML является:

{% extends "registration/registration_base.html" %} 
{% load i18n %} 

{% block content %} 

{% load staticfiles %} 
<script type="text/javascript" src="{% static 'jquery.js' %}"></script> 
{% include 'autocomplete_light/static.html' %} 

<form action="" method="post"> 
    {% csrf_token %} 
    {{ form.as_p }} 
    {{ form.errors }} 
    <input type="submit" value="Add account" /> 
    <input type="hidden" name="next" value="{{ next }}" /> 
</form> 

{% endblock %} 

Это ошибка отслеживающий:

ValidationError at /profile/add_user_accounts/ 
[u'This account already exists'] 

происходит на этой линии:

raise forms.ValidationError(_('This account already exists'), code='invalid') 
+0

Пожалуйста, покажите мне ваш экран, обратное прослеживание модели и формы –

+0

@GeoJacob. Я добавил ошибку. Я не думаю, что форма здесь. –

ответ

2

Вы должны сделать ошибку проверки в формах;

class AddUserAccountsForm(forms.Form): 

    def __init__(self, *args, **kwargs): 
     self.request = kwargs.pop('request', None) 
     super(AddUserAccountsForm, self).__init__(*args, **kwargs) 


    def clean_name(self): 
     Institution = Institution.objects.get(name=self.cleaned_data['name']) 
     new_entry = User.objects.get(id=self.request.user.id) 
     if Account.objects.filter(user=new_entry, institution=Institution.type).exists(): 
      raise forms.ValidationError(_('This account already exists'), code='invalid') 
     return self.cleaned_data['name'] 

в виде;

form = AddUserAccountsForm(request.POST, request=request) 
+0

Я не думаю, что это правильно. Посмотрите другие примеры ошибок. Они сделаны в поле зрения. Вы вызываете ошибку, когда ваш шаблон вызывает представление. http://stackoverflow.com/questions/9436504/django-how-to-display-form-errors-for-each-model-object-in-a-inline-formset –

+0

Здесь они не делают ошибку проверки из представлений, они просто присваивают неверные ошибки формы переменной и отправляют ее в шаблон. form.is_valid() - метод в формах django. Хороший подход к проверке формы - это функция clean(). –

+0

OK. Request.user.id не работает в формах. Как я могу получить идентификатор пользователя в формах? –

0

@GeoJacob Спасибо. Для того, чтобы решить эту проблему идентификатор пользователя, я использовал следующий код:

def clean_name(self): 
    Institution = Institution_long_tail.objects.get(name=self.cleaned_data['name']) 
    current_user = wellfyUser.objects.get(id=self.instance.id) 
    if Access_token_pair.objects.filter(user=current_user, institution=Institution.type).exists(): 
     raise forms.ValidationError(_('This account already exists'), code='invalid') 
    return self.cleaned_data['name'] 

с видом:

form = AddUserAccountsForm(request.POST, instance=current_user)