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 и это создает проблему)

Вернуться на верх