2012-02-24 3 views
5

저자 모델과 책 모델이 있습니다. 사용자는 주어진 저자의 모든 책의 속성을 수정할 수 있습니다. 위에 나열된 모든 오류를 갖기보다는 각 개별 책의 오류를 표시 할 수 있기를 원합니다. 어떻게해야합니까?Django : 인라인 formset의 각 모델 객체에 대한 양식 오류를 표시하는 방법

모형

from django.db import models 
from django.forms import ModelForm, Textarea 
from django import forms 

class Author(models.Model): 
    fname = models.CharField(max_length=100) 
    lname = models.CharField(max_length=100) 
    def fullname(self): 
     return '%s %s' % (self.fname, self.lname) 
    fullname = property(fullname) 
    def __unicode__(self): 
     return self.fullname 

class Books(models.Model): 
    author = models.ForeignKey(Author) 
    title = models.CharField(max_length=50) 
    publisher = models.CharField(max_length=50) 
    edition = models.CharField(max_length=50) 
    comment = models.TextField() 
    def __unicode__(self): 
     return self.title 

VIEW

def author_books_edit(request, author_id): 
    a = get_object_or_404(Author, pk=author_id) 
    authorsbooks = a.books_set.all() 
    bookformset = inlineformset_factory(Author, Books, can_delete=True, can_order=True, exclude=('company',), extra=1) 
    formset = bookformset(instance=a) 
    if request.method == "POST": 
     formset = bookformset(request.POST, request.FILES, instance=a) 
     if formset.is_valid(): 
      formset.save() 
     else: 
      form_errors = formset.errors 
      return render_to_response('test/authors_books_edits.html', {'author': a, 'authorsbooks': authorsbooks, 'formset': formset, 'form_errors': form_errors}, context_instance=RequestContext(request)) 
    return render_to_response('test/authors_books_edits.html', {'author': a, 'authorsbooks': authorsbooks, 'formset': formset,}, context_instance=RequestContext(request)) 

템플릿

#all errors are here 
{% for dict in form_errors %} 
    {{ dict }} 
{% endfor %} 

#all forms are here, i want to pair the errors for each form 
<form method="post" action="/test/{{ author.id }}/books/"> 
    {% csrf_token %} 
     <table> 
     {{ formset }} 
     </table> 
    <input type="submit" value="Submit"/> 
    </form> 

업데이트 된 템플릿이 : 표시되지 않는 오류

<form method="post" action="/test/{{ author.id }}/books/"> 
    {% formset.management_form %} 
    {% csrf_token %} 
    <table> 
     {% for x in formset %} 
     {{x.errors }} 
     {{ x }} 
     {% endfor %} 
    </table> 
<input type="submit" value="Submit"/> 
책을 가정

+0

도서 및 저자 모델의 소스를 추가하여 사용해 볼 수 있습니까? 고마워;) – jpic

+0

@jpic 나중에 모델을 추가 – thedeepfield

+0

"get_object_or_404 (작성자, pk = author_id)" "get_object_or_404 (작성자, pk = author_id)"(대문자 작성자)해야합니까? 또한 모델이 책이라고 확신합니까? 책이 있어야 할 것 같습니까? – jpic

답변

9

편집

authors_books_edits.html

<form method="post" action="/test/{{ author.id }}/books/"> 
    {% csrf_token %} 
    {{ formset.management_form }} 
    {% for form in formset.forms %} 
     {{ form.non_field_errors }} 
     {{ form.errors }} 
     <table> 
      {{ form.as_table }} 
     </table> 
    {% endfor %} 
    <input type="submit" value="Submit"/> 
</form> 

views.py

,

models.py

from django.db import models 

class Author(models.Model): 
    fname = models.CharField(max_length=100) 
    lname = models.CharField(max_length=100) 
    def fullname(self): 
     return '%s %s' % (self.fname, self.lname) 
    fullname = property(fullname) 
    def __unicode__(self): 
     return self.fullname 

class Books(models.Model): 
    author = models.ForeignKey(Author) 
    title = models.CharField(max_length=50) 
    publisher = models.CharField(max_length=50) 
    edition = models.CharField(max_length=50) 
    comment = models.TextField() 
    def __unicode__(self): 
     return self.title 

urls.py

from django.conf.urls.defaults import patterns, include, url 

urlpatterns = patterns('testapp.views', 
    url(r'test/(?P<author_id>\d+)/books/$', 'author_books_edit'), 
) 

당신은 그것을 테스트하는 다른 임시 응용 프로그램을 만들 수 있습니다.

그것은 다음과 같습니다,이 경우

{% for form in formset.forms %} 
    {{ form }} 
{% endfor %} 

장고의 템플릿을 사용하여 양식을 표시를 참조하십시오 http://imageshack.us/photo/my-images/824/screenshotat20120227190.png/

가 == END EDIT이

당신은 같은 형태를 반복 할 수 있습니다 문서 : https://docs.djangoproject.com/en/dev/topics/forms/#displaying-a-form-using-a-template

그런 다음 더 흥미롭고 양식 서식 파일을 사용자 지정하는 방법 (form.non_field_errors 참조) : https://docs.djangoproject.com/en/dev/topics/forms/#customizing-the-form-template

+0

웬일인지 내 오류가 나타나지 않습니다. 템플릿을 업데이트했습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? – thedeepfield

+0

{{x.errors}} 대신 {{x.non_field_errors}}을 (를) 사용해 보셨습니까? – jpic

+0

예, x.non_field_errors는 아무 것도 표시하지 않습니다. {{dict}} {% endfor %}은 (는) 내 양식과 쌍을 이루지 않은 오류를 표시합니다 ... – thedeepfield

1

당신이 할 수있는 형태이다 :

{% for b in authorsbooks %} 
    {{b.errors}} 
{% endfor %} 
+0

내 템플릿을 업데이트했지만 오류가 발생하고 페이지가 다음과 같이 표시됩니다. 부러진 ... 업데이트 된 템플릿을 포함하도록 내 게시물을 업데이트했습니다. – thedeepfield

+0

디버그 출력은 무엇을 말합니까? – Nix

+0

ValidationError [u'ManagementForm 데이터가 없거나 ''로 변조되었습니다] – thedeepfield

관련 문제