CharField 的验证始终为 True (blank=False),但日期字段则不然



我有一个包含字段的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>

处理表单集时,除非在表单集定义本身中设置了最小/最大数量,否则不会验证完全空的表单。

最新更新