Estou tentando descobrir como processar váriosarquivos de um campo de arquivos no Django. Eu descobri como adicionar o atributo "múltiplo" ao campo do formulário. O que preciso fazer agora é percorrer cada arquivo e executar alguma lógica.
Eu tenho um formulário com campos como este (em 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 se parece com isto (também em 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,))
Eu tentei executar minha lógica no clean
método de RecipientListForm
mas só consegui acessar o primeiroarquivo carregado, parece que os outros arquivos não foram carregados. Eu olhei os documentos, mas a forma como esses formulários são configurados não parece estar refletida na documentação sobre formulários, a menos que eu esteja apenas procurando no lugar errado. Obrigado desde já!
Respostas:
1 para resposta № 1De acordo com esta seção dos documentos do Django, você deve ser capaz de obter os arquivos do objeto de solicitação com:
files = request.FILES.getlist("recipients_file")
Espero que isto ajude.