Django | Type error - missing 1 required positional argument: 'file_id'
Здравствуйте, я пытаюсь создать платформу, которая будет решать проблемы, а затем позволит пользователю скачать файл с результатом. У меня проблемы с загрузкой, вот ошибка, которую я получаю
TypeError at /download/
download() missing 1 required positional argument: 'file_id'
models.py
class Snippet(models.Model):
email = models.CharField(max_length=100)
file = models.FileField(upload_to='documents/')
def __str__(self):
return self.email
urls.py
from . import views
from .views import (snippet_detail)
app_name = 'app'
path('download/<int:file_id>/', views.snippet_detail, name='snippet_detail'),
views.py
def download(request, file_id):
media_path = "/home/me/project/media/documents/"
result_path = '/home/me/Desktop/'
max_timeout = 1*24*60*60 #days*hours*mins*secs
if request.method == 'POST':
form = SnippetForm(request.POST, request.FILES)
if form.is_valid():
form = Snippet(file=request.FILES['file'])
form.save()
file_name_final = form.file.name[10:]
file_path = media_path + file_name_final
### analysis code ###
data_id = test['outputs'][0].get('id')
datamap = dict()
datamap['0'] = {'src': 'hda', 'id': data_id}
results_run = ..
results_id = results_run['outputs']
file_id= ''.join(results_id)
if file_id !='':
filepath= 'result_path' + file_id
path = open(filepath, 'rb')
mime_type, _ = mimetypes.guess_type(filepath)
response = HttpResponse(path, content_type=mime_type)
response['Content-Disposition'] = "attachment; file_id=%s" % file_id
return redirect('/download/{file_id}')
else:
raise Http404("No result file")
download.html
<p>Your problem is solved please click here to download
<a class="btn btn-default btn-sm" title="Download the file" data-toggle="tooltip"
data-placement="right" href="{% url 'app:snippet_detail' file.id %}">
<i class="bi bi-download"></i>
</a>
</p>
В вашем представлении загрузки должно быть так:
return redirect('download', file_id=file_id)
Но это вызовет то же самое представление снова, я не думаю, что вы хотите этого, так что это должно быть:
return response
Также я думаю, что url неправильный, он должен быть:
path('download/<int:file_id>/', views.download, name='download')