У меня есть модель родителя и ребенка:
class Parent(models.Model):
name = models.SlugField(max_length=45, null=False)
tags = TaggableManager()
class Child(models.Model):
version = models.CharField(null=False, max_length=10, default='1.0')
upload = models.FileField(
upload_to=hack_upload_path,
blank=False,
null=False
)
parent = models.ForeignKey(
Parent,
on_delete=models.CASCADE,
related_name='versions'
)
class Meta:
get_latest_by = "upload_date"
verbose_name = "version"
verbose_name_plural = "versions"
def __str__(self):
return f'v{self.version}'
Родитель в основном имеет несколько дочерних элементов, которые просто загружаются в файл с некоторыми дополнительными данными. Итак, у меня есть форма, в которой я хочу создать Родителя и одного Дочернего одновременно, поэтому я создал эту форму и просмотр:
class ParentForm(ModelForm):
class Meta:
model = Parent
fields = [
'name',
'tags'
]
ChildFormset = inlineformset_factory(
Parent,
Child,
fields=(
'version',
'upload'
),
extra=1,
max_num=1,
can_delete=False,
)
class ParentCreateView(LoginRequiredMixin, CreateView):
form_class = ParentForm
template_name = 'new.html'
def get_context_data(self, **kwargs):
data = super().get_context_data(**kwargs)
if self.request.POST:
data['versions'] = ChildFormset(
self.request.POST,
self.request.FILES,
instance=self.object
)
else:
data['versions'] = ChildFormset(instance=self.object)
return data
def form_valid(self, form):
form.instance.seller = self.request.user
context = self.get_context_data()
versions = context['versions']
if versions.is_valid():
# It comes here even though the upload field is empty!
self.object = form.save()
versions.instance = self.object
versions.save()
return super().form_valid(form)
else:
return self.render_to_response(
self.get_context_data(
form=form,
versions=versions
)
)
И он проходит проверку if versions.is_valid():
даже при загрузке файла поле не заполнено.
Есть идеи, почему он не проверяет правильность встроенной формы (поле версии проверяется корректно, а поле загрузки файла - нет)?
это шаблон:
<form method="POST" enctype="multipart/form-data">
{% csrf_token %}
<fieldset class="form-group">
{{ form|crispy }}
{{ versions|crispy }}
</fieldset>
<div class="form-group">
<button class="btn btn-info" type="submit">Upload</button>
</div>
</form>