我有一个包含字段的inlineformset_factory
。当此字段是 CharField (blank=False
( 并且我在窗体集上运行is_valid()
时,即使 CharField 留空,也始终返回True
。当我将 CharField 替换为日期字段 (default=timezone.now(), blank=False
( 时,is_valid()
只有在字段按预期填充时才返回True
。为什么在窗体集上运行is_valid()
时,CharField 总是返回True
,而日期字段却没有?请注意,我希望CharField的行为类似于DateField。
有趣的是,当 CharField 和 DateField 都存在时,表单集的行为符合预期。
下面的代码显示了标题和日期,但我如上所述只尝试了标题和日期。任何帮助,不胜感激。这把我逼上了墙!
models.py
class Author(models.Model):
author = models.CharField(max_length=128)
description = models.CharField(max_length=1000)
class Book(models.Model):
author = models.ForeignKey(Author, on_delete=models.CASCADE)
title = models.CharField(max_length=100)
date = models.DateField(default=timezone.now(), blank=False)
forms.py
class AuthorForm(forms.ModelForm):
class Meta:
model = Author
fields = ('author', 'description')
class BookForm(forms.ModelForm):
class Meta:
model = Book
fields = ('title', 'date')
BookFormSet = forms.inlineformset_factory(
Author,
Book,
form=BookForm,
fields=('title', 'date'),
extra=1,
can_delete=False,
can_order=False
)
views.py
class CreateAuthorView(CreateView):
template_name = "author_create.html"
model = Author
form_class = AuthorForm
def get_context_data(self, **kwargs):
context = super(CreateAuthorView, self).get_context_data(**kwargs)
if self.request.POST:
form = self.get_form(self.form_class)
context["book"] = BookFormSet(self.request.POST, instance=form.instance)
else:
context["book"] = BookFormSet()
return context
def form_valid(self, form):
context = self.get_context_data()
book = context["book"]
print(form.data.get("author"))
print("book.is_valid()", book.is_valid()) # ***This always prints True when only CharField is part of Book model***
return redirect(self.get_success_url())
def get_success_url(self):
return reverse("author_list")
author_create.html
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
<div>
{{ form }}
</div>
<div>
{{ book.management_form }}
{% for book_form in book %}
<div>
{{ book_form }}
</div>
{% endfor %}
</div>
<button type="submit">Submit Author</button>
</form>
处理表单集时,除非在表单集定义本身中设置了最小/最大数量,否则不会验证完全空的表单。