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