问题遇到的现象和发生背景
Django 使用form实现多文件上传,是《Django3Web应用开发实践》(黄永祥著)这本书 第8章 表单与模型 8.9 多文件批量上传的示例,但运行出错,进行数据迁移时报错!
遇到的现象和发生背景,请写出第一个错误信息
ValueError: ClearableFileInput doesn't support uploading multiple files.
用代码块功能插入代码,请勿粘贴截图。 不用代码块回答率下降 50%
from django import forms
from .models import *
class PersonInfoForm(forms.ModelForm):
certificate = forms.FileField(label='证件', allow_empty_file=True, widget=forms.ClearableFileInput(attrs={'multiple': True}))
class Meta:
model = PersonInfo
fields = '__all__'
labels = {
'name': '名字',
'age': '年龄',
}
运行结果及详细报错内容
tactics@qbpb:/data/BOOK/Django3 Web应用开发实践【黄永祥】/Django3 Web应用开发实战/chapter8/8.9/MyDjango$ python manage.py makemigrations
/usr/lib/python3/dist-packages/requests/__init__.py:89: RequestsDependencyWarning: urllib3 (2.1.0) or chardet (3.0.4) doesn't match a supported version!
warnings.warn("urllib3 ({}) or chardet ({}) doesn't match a supported "
Traceback (most recent call last):
File "manage.py", line 15, in <module>
execute_from_command_line(sys.argv)
File "/usr/local/lib/python3.8/dist-packages/django/core/management/__init__.py", line 442, in execute_from_command_line
utility.execute()
File "/usr/local/lib/python3.8/dist-packages/django/core/management/__init__.py", line 436, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/usr/local/lib/python3.8/dist-packages/django/core/management/base.py", line 412, in run_from_argv
self.execute(*args, **cmd_options)
File "/usr/local/lib/python3.8/dist-packages/django/core/management/base.py", line 453, in execute
self.check()
File "/usr/local/lib/python3.8/dist-packages/django/core/management/base.py", line 485, in check
all_issues = checks.run_checks(
File "/usr/local/lib/python3.8/dist-packages/django/core/checks/registry.py", line 88, in run_checks
new_errors = check(app_configs=app_configs, databases=databases)
File "/usr/local/lib/python3.8/dist-packages/django/core/checks/urls.py", line 14, in check_url_config
return check_resolver(resolver)
File "/usr/local/lib/python3.8/dist-packages/django/core/checks/urls.py", line 24, in check_resolver
return check_method()
File "/usr/local/lib/python3.8/dist-packages/django/urls/resolvers.py", line 494, in check
for pattern in self.url_patterns:
File "/usr/local/lib/python3.8/dist-packages/django/utils/functional.py", line 57, in __get__
res = instance.__dict__[self.name] = self.func(instance)
File "/usr/local/lib/python3.8/dist-packages/django/urls/resolvers.py", line 715, in url_patterns
patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
File "/usr/local/lib/python3.8/dist-packages/django/utils/functional.py", line 57, in __get__
res = instance.__dict__[self.name] = self.func(instance)
File "/usr/local/lib/python3.8/dist-packages/django/urls/resolvers.py", line 708, in urlconf_module
return import_module(self.urlconf_name)
File "/usr/lib/python3.8/importlib/__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
File "<frozen importlib._bootstrap>", line 991, in _find_and_load
File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 848, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "/data/BOOK/Django3 Web应用开发实践【黄永祥】/Django3 Web应用开发实战/chapter8/8.9/MyDjango/MyDjango/urls.py", line 7, in <module>
path('', include(('index.urls', 'index'), namespace='index')),
File "/usr/local/lib/python3.8/dist-packages/django/urls/conf.py", line 38, in include
urlconf_module = import_module(urlconf_module)
File "/usr/lib/python3.8/importlib/__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
File "<frozen importlib._bootstrap>", line 991, in _find_and_load
File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 848, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "/data/BOOK/Django3 Web应用开发实践【黄永祥】/Django3 Web应用开发实战/chapter8/8.9/MyDjango/index/urls.py", line 2, in <module>
from .views import *
File "/data/BOOK/Django3 Web应用开发实践【黄永祥】/Django3 Web应用开发实战/chapter8/8.9/MyDjango/index/views.py", line 3, in <module>
from .form import PersonInfoForm
File "/data/BOOK/Django3 Web应用开发实践【黄永祥】/Django3 Web应用开发实战/chapter8/8.9/MyDjango/index/form.py", line 4, in <module>
class PersonInfoForm(forms.ModelForm):
File "/data/BOOK/Django3 Web应用开发实践【黄永祥】/Django3 Web应用开发实战/chapter8/8.9/MyDjango/index/form.py", line 5, in PersonInfoForm
certificate = forms.FileField(label='证件', allow_empty_file=True, widget=forms.ClearableFileInput(attrs={'multiple': True}))
File "/usr/local/lib/python3.8/dist-packages/django/forms/widgets.py", line 427, in __init__
raise ValueError(
ValueError: ClearableFileInput doesn't support uploading multiple files.
我的解答思路和尝试过的方法,不写自己思路的,回答率下降 60%
在百度和CSDN搜索“ValueError: ClearableFileInput doesn't support uploading multiple files.”没有找到答案,查看了widgets.py 文件,也找不到错在哪里,查看别人都是这么用的,Django 实现多文件批量上传但没有错,为什么到我这就错了
//form.py
class FileInput(Input):
allow_multiple_selected = False
input_type = "file"
needs_multipart_form = True
template_name = "django/forms/widgets/file.html"
def __init__(self, attrs=None):
if (
attrs is not None
and not self.allow_multiple_selected
and attrs.get("multiple", False)
):
raise ValueError(
"%s doesn't support uploading multiple files."
% self.__class__.__qualname__
)
if self.allow_multiple_selected:
if attrs is None:
attrs = {"multiple": True}
else:
attrs.setdefault("multiple", True)
super().__init__(attrs)
def format_value(self, value):
"""File input never renders a value."""
return
def value_from_datadict(self, data, files, name):
"File widgets take data from FILES, not POST"
getter = files.get
if self.allow_multiple_selected:
try:
getter = files.getlist
except AttributeError:
pass
return getter(name)
def value_omitted_from_data(self, data, files, name):
return name not in files
def use_required_attribute(self, initial):
return super().use_required_attribute(initial) and not initial
我想要达到的结果,如果你需要快速回答,请尝试 “付费悬赏”
解决这个问题,如果原书作者能看到最好,因为他的代码有问题了,可能需要改进!