2012-02-15 2 views
1

У меня есть charfield django, который проверяется методом is_valid(). Предполагается, что пользователь должен ввести действительное логическое выражение в этом поле, поэтому я написал метод синтаксического анализа, который вызывает исключение, если выражение неверно.Усиление is_valid() с исключением

Как я могу улучшить метод is_valid(), чтобы покрыть это исключение и отобразить пользователю сообщение об ошибке, что его запрос был неправильным?

Я прочитал эту статью (https://docs.djangoproject.com/en/dev/ref/forms/validation/#cleaning-a-specific-field-attribute), но до сих пор не знаю, как это сделать.

 try: 
     job = Job(user=request.user) # set the current user 
     form = JobForm(request.POST, instance=job) 

     if form.is_valid(): 
      form.save() 
      job.execute() 
      messages.success(request, u'A new job with the query "{query}" was created.'.format(query=job.query)) 
      return HttpResponseRedirect(reverse('job-index')) 

     return self.render_to_response({'job_form': form, 'is_new': True}) 
    except ParseError: 
     return self.render_to_response({'job_form': form, 'is_new': True}) 

Попытка ... except-Block должна быть выполнена внутри метода is_valid(), то есть моего намерения. Кто-то получил какие-то намеки?

ответ

3

Вы предоставили ответ на свой вопрос: create your own form (or model form) и perform custom validation в этом поле формы, используя его метод clean_'fieldname'(). Так, например, сказать, ваша модель:

class Job(models.Model): 
    expression_field = models.CharField(...) 
    ... 

создания forms.py:

class JobForm(forms.ModelForm): 
    pass 
    class Meta: 
     model = Job 

    def clean_expression_field(self): 
     # You perform your custom validation on this field in here, 
     # raising any problems 
     value = self.cleaned_data['expression_field'] 
     if value is 'really_bad': 
       raise forms.ValidationError("bad bad bad") 
     return value 

затем использовать его в вашем views.py, как вы уже в вашем примере. Теперь, если значение, которое вводит пользователь, не соответствует вашим критериям, будет автоматически поднято исключение

+0

Я писал очень похожий ответ, когда вы вошли. Хорошо сказано! – aganders3

Смежные вопросы