- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个带有必需文件字段的 Django 表单(不是 ModelForm)。根据the FileField documentation ,FileField 的验证应该验证非空文件数据是否已绑定(bind)到表单,但我没有看到这种行为。相反,我可以在没有文件的情况下提交表单,并且表单通过验证。预期的行为是验证失败。
当在表单中指定文件时,事情会按预期工作。
我的表单看起来像这样:
class BucketUploadForm(forms.Form):
file = forms.FileField(required=True) # required=True is the default, but I'm being explicit
def clean(self):
upload_to = '/some/path'
upload_to += self.cleaned_data['file'].name # this is raising a KeyError
我的观点看起来像这样:
def bucket_upload(request):
if request.method == 'POST':
form = BucketUploadForm(request.POST, request.FILES)
if form.is_valid(): # this is raising the aforementioned KeyError when no file is submitted
do_stuff()
return HttpResponseRedirect(some_url)
else:
form = BucketUploadForm(initial=request.GET)
return render_to_response('handin/bucket_upload.html', {'form': form}, context_instance=RequestContext(request))
我的模板看起来像这样:
<form action="" method="post" enctype="multipart/form-data">
{% csrf_token %}
<table>
{{ form }}
</table>
<input type="submit" value="Upload" />
</form>
回溯看起来像这样:
Django Version: 1.3.1
Python Version: 2.7.3
Installed Applications:
['django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.admin',
'django.contrib.admindocs',
'hgrepo',
'sshkey',
'handin',
'accounts']
Installed Middleware:
('django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware')
Traceback:
File "/usr/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response
111. response = callback(request, *callback_args, **callback_kwargs)
File "/usr/lib/python2.7/dist-packages/django/contrib/auth/decorators.py" in _wrapped_view
23. return view_func(request, *args, **kwargs)
File "/usr/lib/python2.7/dist-packages/django/views/decorators/http.py" in inner
45. return func(request, *args, **kwargs)
File "/home/sduckwo/projects/webhandin/webhandin/handin/views.py" in bucket_upload
461. if form.is_valid():
File "/usr/lib/python2.7/dist-packages/django/forms/forms.py" in is_valid
121. return self.is_bound and not bool(self.errors)
File "/usr/lib/python2.7/dist-packages/django/forms/forms.py" in _get_errors
112. self.full_clean()
File "/usr/lib/python2.7/dist-packages/django/forms/forms.py" in full_clean
268. self._clean_form()
File "/usr/lib/python2.7/dist-packages/django/forms/forms.py" in _clean_form
296. self.cleaned_data = self.clean()
File "/home/sduckwo/projects/webhandin/webhandin/handin/forms.py" in clean
116. upload_to += self.cleaned_data['file'].name
Exception Type: KeyError at /courses/a/b/assignments/c/sduckwo/upload
Exception Value: 'file'
更新
从 BucketUploadForm 中删除 clean 方法会导致 FileField 的验证按预期失败。但是,我需要 clean 方法来进行其他检查,因此无法永久删除它。
我还发现,通过将 clean 方法修改为如下所示:
class BucketUploadForm(forms.Form):
file = forms.FileField(required=True) # required=True is the default, but I'm being explicit
def clean(self):
if 'file' not in self.cleaned_data:
raise ValidationError('No file or empty file given')
upload_to = '/some/path'
upload_to += self.cleaned_data['file'].name # this is raising a KeyError
然后验证按预期失败,但我收到两条错误消息:
这告诉我 FileField.clean() 正在引发 ValidationError,但该异常会以某种方式被忽略,除非 BucketUploadForm.clean() 不存在或也引发 ValidationError。
所以现在我可能更接近我的最终目标,但仍然很困惑。
最佳答案
我想我以前见过这个。从轶事经验来看,如果缺少字段,Django 似乎不会停止验证(例如,即使缺少必填字段,它也会调用 clean() )。它表示由于未在 clean_data 中包含字段名称而缺少必填字段。
斯科特指出它是 documented here :
For any field, if the Field.clean() method raises a ValidationError, any field-specific cleaning method is not called. However, the cleaning methods for all remaining fields are still executed.
因此,我认为解决方案只是通过检查“file”键是否在cleaned_data中来防御性地对clean()方法进行编程,如果不是,则按原样返回cleaned_data。 Django 已经知道缺少必需的字段,因此 is_valid() 将失败并且不会造成任何损害。
def clean(self):
upload_to = '/some/path'
if not 'file' in self.cleaned_data:
return self.cleaned_data
upload_to += self.cleaned_data['file'].name
关于Django forms.FileField(required=True) 如果为空则通过验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17596343/
我正在使用 Django 来建立一个网站,我使用两个 FileField 一个供用户上传文档,另一个系统将把文档保存到它的备份中。My Model def file_path_dir(instance
我正在用 django 实现一个应用程序,它有一个带有 FileField 的模型: class Slideshow(models.Model): name = models.CharFiel
我有一个包含 FileField 的模型如下 class Employer(models.Model): logo = models.FileField(storage=FileSys
我觉得不得不问这个问题有点愚蠢……但我似乎找不到任何地方的记录。 如果我有 Model与 FileField , 我怎么能塞一个上传的FILE成FileField ? 例如,我想做这样的事情: cla
我一直在挠头 FileField。 FileField 是否需要单独的过程? 虽然我的网址被保存了..但我的文件没有上传......我做错了什么? 这是我的models.py ... class Op
给定一个带有名为 number 的必填字段的模型和一个 ClearableFileInput FileField 调用 upload_file : class ExampleModel(models.
我需要为 FileField 对象保存文件,该对象的名称和内容不是来自表单(而是来 self 的代码)。怎么办? 我需要这样的东西: field = FileField() ... save_unde
我的 media/logo/ 文件夹中存储了一个图像,我想将其从我的模型保存到模型的 FileField 中看法。这是我尝试过的方法,但遇到编码错误,并且在尝试保存文件后文件已损坏。 UnicodeD
我需要为 FileField 对象保存文件,该对象的名称和内容不是来自表单(而是来 self 的代码)。怎么办? 我需要这样的东西: field = FileField() ... save_unde
我的 media/logo/ 文件夹中存储了一个图像,我想将其从我的模型保存到模型的 FileField 中看法。这是我尝试过的方法,但遇到编码错误,并且在尝试保存文件后文件已损坏。 UnicodeD
我有类似的东西: MEDIA_ROOT = '/home/httpd/foo/media/' MEDIA_URL = 'http://www.example.org/media/' (……) file
我在我的项目中实现了一个 FileField 模型。我可以成功上传 svg 文件并将它们保存到所需位置。 在我的项目中,我大量使用用户上传的图像 (JPG),它们保存到正确的位置,我可以毫无问题地在我
在我的应用程序中上传文件时遇到问题。用户提交报告并可以添加附件(通过外键关系)。我已经显示了内联表单,如果我将其留空,它会正常工作,但是当我尝试上传文件然后提交表单时,出现 500 错误。基础报告已生
如果我正确阅读了文档,那么 Django 中的 FileField 不知道文件的 content_type:https://docs.djangoproject.com/en/2.1/ref/mode
是否可以动态地为 forms.FileField() 赋予初始值? 最佳答案 我不确定,如果这就是你想要的,但是…… 显然,您不能为文件输入设置初始数据(这意味着您将文件发送给用户)。 Django
我正在尝试在模板中调用 FileField 时检索绝对路径(以 http://开头)。 我怎样才能做到这一点? IE:{{fl.uploadedfile}} -> 返回相对路径,如 media/upl
我正在尝试使用 FileField 存储文件,但文件目标的路径大于 100 个字符。如何增加允许的字符数?我试过 max_length=255 但没有用。 谢谢。 编辑:添加模型 class File
我正在尝试构建一个应用程序以使用 Flask 和 WTForms 的 FileField 表单字段将文件上传到 Web 服务器。该帖子正在成功通过,但我很好奇为什么 form.validate_on_
在现有表单中,我使用 FileField 附加不同类型的文件 .txt、.pdf、.png、.jpg 等 并且工作正常,但现在我需要该字段来接受多个文件,因此我使用属性 multiple 作为输入来接
如何获取 FileField 的链接?我尝试了url字段,但它给出了文件路径: In [7]: myobject.myfilefield.path Out[7]: u'/home/xxxx/media
我是一名优秀的程序员,十分优秀!