8

著者モデルと本モデルがあります。ユーザーは、特定の著者のすべての本のプロパティを変更できます。すべてのエラーを上部に表示するのではなく、個々の本のエラーを表示できるようにしたいのですが、どうすればよいですか?

モデル

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

見る

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"/>

4

2 に答える 2

13

編集

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

from django.shortcuts import *
from django.forms.models import inlineformset_factory

from .models import *

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('authors_books_edits.html', {'author': a, 'authorsbooks': authorsbooks, 'formset': formset, 'form_errors': form_errors}, context_instance=RequestContext(request))
    return render_to_response('authors_books_edits.html', {'author': a, 'authorsbooks': authorsbooks, 'formset': formset,}, context_instance=RequestContext(request))

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'),
)

別の一時的なアプリを作成してテストできます。

次のようになります:http://imageshack.us/photo/my-images/824/screenshotat20120227190.png/

==編集終了

次のようにフォームを反復処理できます。

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

その場合は、テンプレートドキュメントを使用したDjangoのフォームの表示を参照してください: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

于 2012-02-24T19:12:33.457 に答える
1

その本があなたができる形であると仮定すると:

{% for b in authorsbooks %}
    {{b.errors}}
{% endfor %}
于 2012-02-24T19:11:57.117 に答える