私はこれにかなり慣れていないので、我慢してください。modelformset_factory
Book モデルでフォームを作成するために使用する「Edit Book」フォームを作成しました。モデルからデータをフォームにロードして保存しようとすると、フォーム内のデータを変更するかどうかに関係なく、is_valid()
常に False が返されます。
コード:
models.py
class Book(models.Model):
def __unicode__(self):
return self.title
user = models.ForeignKey(User)
title = models.CharField(max_length=300)
author = models.CharField(max_length=200)
description = models.TextField(blank=True)
pub_date = models.DateField(blank=True, null=True)
link = models.URLField(blank=True, null=True)
category = models.CharField(max_length=2, choices=CATEGORY_CHOICES)
rating = models.IntegerField(blank=True, null=True, default=0)
date_added = models.DateField(auto_now_add=True)
date_reading = models.DateField(blank=True, null=True)
date_read = models.DateField(blank=True, null=True)
notes = models.TextField(blank=True, null=True)
reading = models.BooleanField(default=False)
book_read = models.BooleanField(default=False)
ビュー.py
from django.forms.models import modelformset_factory
from models import Book
def edit_book(request, book_id):
BookFormSet = modelformset_factory(Book, exclude=('user', 'date_reading', 'date_read', 'reading', 'book_read'), max_num=1)
if request.method == 'POST':
formset = BookFormSet(queryset=Book.objects.filter(pk=book_id))
if formset.is_valid():
formset.save()
return redirect('/books/' + str(book_id))
else:
formset = BookFormSet(queryset=Book.objects.filter(pk=book_id))
return render(request, 'books/edit.html', {'formset':formset})
その他の注意事項:
formset.is_bound は Falseを返します
formset.errors は [] を返します
formset.non_form_errors() は何も返しません
formset.has_changed() は True を返します