FileField действителен, даже если он пуст - PullRequest
1 голос
/ 28 апреля 2020

У меня есть модель родителя и ребенка:

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>

1 Ответ

0 голосов
/ 28 апреля 2020

Я исправил это, установив min_num=1 в форме набора фабрики

...