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>
и это все, что необходимо.