models.FileField(blank = False):即使我在更新期间没有选择文件,表单也是有效的

时间:2017-06-27 11:08:52

标签: django

Django 1.11.2

此视图通过 AJAX 调用。这可能很重要。

在模型中我使用了blank = False。在DeleteOldFileMixin中我放了一个断点(请将代码中的注释放在下面的位置)。

我运行Django,尝试更新现有的UserFile对象。出现更新表单。但我不选择任何文件,我只需按“提交”。我发生在断点处。

断点位于form_valid方法中。这意味着表单已经清理完毕。

我的代码工作不正确:它删除旧文件而不用新文件替换它。

但如果我使用blank = False,为什么表单应该有效?如果表格可以拦截这个空场,我会很高兴。

你能帮我一把吗?

class UserFile(models.Model):
    item = models.ForeignKey(Item, on_delete=models.PROTECT)

    user_file = models.FileField(blank=False,
                                 verbose_name=_("file"),
                                 max_length=255,
                                 upload_to=get_file_path)


class FileForm(ModelForm):

    class Meta:
        model = UserFile
        exclude = []


class DeleteOldFileMixin(ModelFormMixin):

    def form_valid(self, form):
        old_file_name = form.initial.get('user_file').name # Breakpoint
        try:
            os.remove("{}/{}".format(settings.MEDIA_ROOT, old_file_name))
        except FileNotFoundError:
            pass # Do nothing.

        return super(DeleteOldFileMixin, self).form_valid(form)


class FileUpdate(DeleteOldFileMixin,
                 UpdateView):
    model = UserFile
    form_class = FileForm

稍后添加:

ValueError risen:

class DeleteOldFileMixin(ModelFormMixin):

    def form_valid(self, form):
        raise ValueError(self.request.FILES)

结果:

Traceback (most recent call last):
  File "/home/michael/PycharmProjects/venv/photoarchive/lib/python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = get_response(request)
  File "/home/michael/PycharmProjects/venv/photoarchive/lib/python3.6/site-packages/django/core/handlers/base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/michael/PycharmProjects/venv/photoarchive/lib/python3.6/site-packages/django/core/handlers/base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/michael/PycharmProjects/venv/photoarchive/lib/python3.6/site-packages/django/views/generic/base.py", line 68, in view
    return self.dispatch(request, *args, **kwargs)
  File "/home/michael/PycharmProjects/venv/photoarchive/lib/python3.6/site-packages/django/contrib/auth/mixins.py", line 56, in dispatch
    return super(LoginRequiredMixin, self).dispatch(request, *args, **kwargs)
  File "/home/michael/PycharmProjects/venv/photoarchive/lib/python3.6/site-packages/django/contrib/auth/mixins.py", line 92, in dispatch
    return super(PermissionRequiredMixin, self).dispatch(request, *args, **kwargs)
  File "/home/michael/PycharmProjects/photoarchive_2/photoarchive/general/view_mixins.py", line 61, in dispatch
    **kwargs);
  File "/home/michael/PycharmProjects/venv/photoarchive/lib/python3.6/site-packages/django/views/generic/base.py", line 88, in dispatch
    return handler(request, *args, **kwargs)
  File "/home/michael/PycharmProjects/venv/photoarchive/lib/python3.6/site-packages/django/views/generic/edit.py", line 240, in post
    return super(BaseUpdateView, self).post(request, *args, **kwargs)
  File "/home/michael/PycharmProjects/venv/photoarchive/lib/python3.6/site-packages/django/views/generic/edit.py", line 183, in post
    return self.form_valid(form)
  File "/home/michael/PycharmProjects/photoarchive_2/photoarchive/general/view_mixins.py", line 113, in form_valid
    raise ValueError(self.request.FILES)
ValueError: <MultiValueDict: {}>
[27/Jun/2017 14:39:22] "POST /files/7/update/ HTTP/1.1" 500 20475

0 个答案:

没有答案