2011-12-11 2 views
1

저는 Django Forms에 새로운 것이므로 해결할 수없는 문제에 직면하고 있습니다. 나는 인터넷 검색 및 문서를 읽고 있었지만, 이것이 설명되는 곳을 찾을 수는 없다.양식 검증 오류가 발생하면 어떻게 지정합니까?

@login_required 
def new_animal(request): 
    if request.method == "POST": 
     form = AnimalForm(request.POST) 
     if form.is_valid(): 
      form.save() 
      return render_to_response('/') 
     else: 
      variables = RequestContext(request, {'e': form.errors}) 
      return render_to_response('web/error.html', variables) 
    else: 
     form = AnimalForm() 
    variables = RequestContext(request, {'form': form}) 
    return render_to_response('web/animal_form.html', variables) 

내가 오류 도입이 보인다 :이보기를 호출 urls.py를 통해이 정보를 렌더링

class Animal(models.Model): 
    name = models.CharField(max_length=300) 
    age = models.PositiveSmallIntegerField() 
    race = models.ForeignKey(Race) 
    description = models.TextField() 
    state = models.ForeignKey(State) 
    pub_date = models.DateTimeField(auto_now_add=True) 
    adoption_limit = models.DateTimeField(blank=True, null=True) 
    location = models.ForeignKey(Location) 
    publisher = models.ForeignKey(User) 
    def __unicode__(self): 
     return self.name 

class AnimalForm(ModelForm): 
    class Meta: 
     model = Animal 

: 내 문제는 내가 가지고 있다는 동물ModelModelForm입니다 adoption_limit 필드이므로 데이터가 DB에 저장되지 않습니다. 이는 양식에 표시된 텍스트 필드에 날짜가 아닌 시간을 설정하기 때문입니다.

나는 두 가지를 할 수있는 방법을 알고 싶습니다

: 내가 설정하지 않은 분야에 옆에 텍스트를 추가 할 수 있도록 내가 다시 폼에 오류 메시지를 보낼 수있는 방법

  1. 을 바르게? 예. 관리자가하는 것처럼 말입니다.
  2. admin 인터페이스에있는 DateTimeField에 대해 동일한 입력 유형을 어떻게 넣을 수 있습니까?

답변

4

당신이 당신의 web/error.html 템플릿, 양식 오류를 표시하려면보기를 작성한 방법 (오늘 지금 기능), 단순히 출력 오류 : 그러나

{%if e %} 
    You had some errors in your submission!<br /> 
    {{ e }} 
{% endif %} 

, 당신은하지 않습니다 명시 적으로 오류 목록을 전달한 경우 양식 자체의 일부입니다. 단순화의 비트 :

variables = RequestContext(request, {'form': form}) 
return render_to_response('web/error.html', variables) 

그런 다음 템플릿 : 질문의 두 번째 부분에 대한

{% if form.errors %} 
    You have some errors!<br /> 
    {{ form.errors }} 
{% endif %} 

- 장고 날짜 시간 위젯을 표시 - 일이 좀 더 참여 :

# First, you need to import the widget: 
from django.contrib.admin.widgets import AdminSplitDateTime 
from django.forms import TextField 

# In your form class, you have to specify the widget 
# for the field. 

class AnimalForm(forms.ModelForm): 
    pub_date = models.TextField(widget=AdminSplitDateTime) 
    class Meta: 
     model = Animal 

그래도 작동하려면 모든 javascript와 css가 포함되어 있으므로 관리자 미디어 디렉토리가 프로젝트에서 액세스 할 수 있도록해야합니다. 또한 모든 스타일 시트가 추가되었는지 확인해야합니다. 선호하는 라이브러리의 자바 스크립트 양식 위젯을 사용하는 것이 훨씬 쉽고 간단합니다. documentation에 명시된대로 당신이 어떤 필드를 오버라이드 (override)하는 경우

마지막으로, 당신은 다른 모든 유효성 검사 논리를 직접 추가해야합니다

명시 적으로이 같은 양식 필드를 초기화하는 경우, 장고 을 가정 당신 그것의 행동을 완전히 정의하고 싶다; 따라서 기본값 속성 (예 : max_length 또는 required)은 해당 모델에서 가져 오지 않습니다. 모델 에 지정된 동작을 유지하려면 양식 필드를 선언 할 때 관련 인수를 명시 적으로 설정해야합니다.

+0

오류를 표시하기 위해 동일한 템플릿을 호출 할 수 있습니까? 양식에서 확인 된 사항을 유지하면서 잘못된 필드 옆에 메시지를 표시 하시겠습니까? – amb

+0

'DateTime' 위젯의 경우,'Date' 필드의 모델을 변경하려고합니다. 실제로 시간이 필요하지 않습니다. – amb

+0

템플릿과 관련하여 동일한 템플릿을 사용하여 동일한 양식을 다시 표시 할 수 있습니다. 날짜 필드를 사용하는 경우 변경하지 않는 한 기본 형식은 'yyyy-mm-dd'입니다. –

0

burhan 님의 답변은 spot on입니다. 또한, 양식에서 게시자를 숨기고 사용자가 볼 수 있도록 조치 할 수 있습니다.

이렇게하려면 ModelForm의 Meta 클래스에 exclude = ('publisher',)를 추가하십시오. 보기에

: 그리고

if form.is_valid(): 
    animal = form.save(commit=false) 
    animal.publisher = request.user 
    animal.save() 

그렇지 않으면, 내가 양식은 당신이 원하는하지 않을 수 드롭 다운에있는 모든 사용자를 보여줍니다 생각을 의미한다.

관련 문제