Django - TypeError __init__() missing 1 required positional argument when uploading a file

Я хочу установить начальное значение "test" в поле name при загрузке файла с помощью Django. Вот что я пробовал в views.py:

class UploadFile(CreateView):
    form_class = UploadFileForm
    template_name = "tool/upload.html"
    success_url = reverse_lazy('tool:index')

    fields = ['file',]

    def get(self, request, *args, **kwargs):
        form = self.form_class()
        return render(request, self.template_name, {'form': form})

    def post(self, request, *args, **kwargs):
        form = self.form_class(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            return redirect(self.success_url)
        else:
            return render(request, self.template_name, {'form': form})

И в forms.py:

class UploadFileForm(forms.ModelForm):

    class Meta:
            model = CheckFile
            fields = ['file', ]

    def __init__(self, file, *args, **kwargs):
        file = kwargs.pop('file')
        super(UploadFileForm, self).__init__(*args, **kwargs)
        if file:
            self.fields['name'] = "test"

Но в итоге я получаю следующую ошибку: TypeError: UploadFileForm.__init__() missing 1 required positional argument: 'file'

Я не понимаю, почему у меня постоянно возникает эта ошибка. Не могли бы вы мне помочь?

Спасибо!

Edit : вот HTML-форма.

{% extends 'base.html' %}

{% block content %}

<h1>Enregistrer les tarifs</h1>
    <form method="POST">
        <p>
            {% csrf_token %}
            {{ form.as_p }}
        </p>
        <button type="submit">Save</button>
    </form>

{% endblock %}

Вы делаете слишком много, file = kwargs.pop('file') не имеет смысла: данные передаются как request.FILES и передаются в ModelForm, ваш ModelForm может выглядеть следующим образом:

class UploadFileForm(forms.ModelForm):
    class Meta:
        model = CheckFile
        fields = ['file', ]

    # no __init__

То же самое для вашего представления: Django автоматически создаст форму и передаст данные соответствующим образом. Если вы хотите указать имя CheckFile, вы можете сделать это в методе form_valid:

class UploadFileView(CreateView):
    form_class = UploadFileForm
    template_name = "tool/upload.html"
    success_url = reverse_lazy('tool:index')
    
    def form_valid(self, form):
        form.instance.name = 'test'
        return super().form_valid(form)

Если вы отправляете файлы, вам следует указать enctype="multipart/form-data":

<form method="POST" enctype="multipart/form-data">
    <p>
        {% csrf_token %}
        {{ form.as_p }}
    </p>
    <button type="submit">Save</button>
</form>

и это все, что необходимо.

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