Как я могу обработать несколько файлов из файлового поля в Django?
Я пытаюсь выяснить, как обрабатывать несколько файлов из файлового поля в Django. Я выяснил, как добавить атрибут "несколько" в поле формы. Теперь мне нужно пройтись по каждому файлу и выполнить некоторую логику.
У меня есть форма с полями, как это (в views.py):
class RecipientListForm(forms.Form):
name = forms.CharField()
recipients = forms.CharField(
required=False,
widget=forms.Textarea(attrs={'placeholder':"James Jameson, james.jameson@aol.com"}),
label="Paste recipient information (comma-separated, in 'name, email' format)")
recipients_file = RecipientsFileField(
required=False,
widget=forms.FileInput(attrs={'multiple':"true"}),
label="Or upload a .csv file in 'name, email' format (max size %dMB)" % RecipientsFileField.MAX_FILESIZE_MB)
def __init__(self, account, recipient_list=None, *args, **kwargs):
super(RecipientListForm, self).__init__(*args, **kwargs)
self.account = account
self.recipient_list = recipient_list
def clean(self, *args, **kwargs):
...
RecipientsFileField выглядит следующим образом (также в views.py):
class RecipientsFileField(forms.FileField):
MAX_FILESIZE_MB = 30
def validate(self, value):
super(RecipientsFileField, self).validate(value)
if not value: return
fname = value.name
if (value.content_type not in (('text/csv',) + EXCEL_MIMETYPES) or not re.search(r'\.(xlsx?|csv)$', fname, re.I)):
raise forms.ValidationError('Please upload a .csv or .xlsx file')
if value.size >= self.MAX_FILESIZE_MB * 1024 * 1024:
raise forms.ValidationError('File must be less than %dMB' % (self.MAX_FILESIZE_MB,))
Я попытался выполнить свою логику в clean
метод RecipientListForm
но я был в состоянии получить доступ только к первому загруженному файлу, кажется, что другие файлы не загружены. Я посмотрел на документы, но способ настройки этих форм, похоже, не отражен в документации о формах, если только я не смотрю не туда. Заранее спасибо!
1 ответ
Согласно этому разделу документации Django, вы сможете получить файлы из объекта запроса с помощью:
files = request.FILES.getlist('recipients_file')
Надеюсь это поможет.