TypeError: __init__() получила неожиданный аргумент ключевого слова 'file'
Я использую Django для разработки платформы, где пользователи могут загружать файлы. Эта функция прекрасно работала в течение нескольких месяцев без каких-либо проблем, но по какой-то причине теперь я получаю эту ошибку при попытке загрузить файл:
Traceback:
Traceback (most recent call last):
File "/home/me/.local/lib/python3.8/site-packages/django/core/handlers/exception.py", line 55, in inner
response = get_response(request)
File "/home/me/.local/lib/python3.8/site-packages/django/core/handlers/base.py", line 197, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/me/project/app/views.py", line 314, in invoke_local
instance = SingleEndForm(file=request.FILES['file'])
Exception Type: TypeError at /invoke_local/
Exception Value: __init__() got an unexpected keyword argument 'file'
Моя модель:
class SingleEnd(models.Model):
file = models.FileField(upload_to="documents/")
email = models.CharField(max_length=100)
def __str__(self):
return self.email
Моя форма:
class SingleEndForm(forms.ModelForm):
class Meta:
# shows which model to use from models.py
model = SingleEnd
# fields = '__all__'
fields = ["file", "email"]
labels = {
"file": "input your fasta/fastq file (min 3 sequences)",
"email": "input your email to get a notification for your results in a timely manner",
}
widgets = {
"email": forms.EmailInput(attrs={"class": "form-control"}),
"file": forms.FileInput(attrs={"class": "form-control"}),
}
Мое мнение:
def invoke_local(request):
# path to save inputs
media_path = "/home/me/project/media/documents/"
# path to save outputs
result_path = "/home/me/project/media/results"
if request.method == "POST":
# use the form to upload form info (post) and files
form = SingleEndForm(request.POST, request.FILES)
if form.is_valid():
# saves full form
instance = SingleEndForm(file=request.FILES['file'])
instance.save()
# changes file name if the name is the same
file_name_final = instance.file.name[10:]
# final path
file_path = media_path + file_name_final
else:
raise Http404("Form not entered correctly")
form = SingleEndForm()
return render(request, "invoke_local.html", {"form": form})
Я действительно не понимаю, что я сделал не так.
На примере в документации Обработка загруженных файлов с помощью модели вы смешиваете два разных метода, что создает проблему
Вы можете напрямую написать Form
form = SingleEndForm(request.POST, request.FILES)
if form.is_valid():
# saves full form
form.save()
Или нужно создать экземпляр модели SingleEnd
вместо формы SingleEndForm
form = SingleEndForm(request.POST, request.FILES)
if form.is_valid():
# use model
instance = SingleEnd(file=request.FILES['file'])
instance.save()
(но вы используете форму SingleEndForm
и это создает проблему)