Django - FileField 不会上传到数据库
Django - FileField won't upload to database
我正在尝试上传一些带有 FileField
的文件,但是当我点击提交按钮并且 运行 form.save()
我的数据库中有一个新行 table 但我尝试上传的文件不存在。
我一直在寻找一些时间来解决我的问题,但我唯一看到的是关于 enctype="multipart/form-data"
,但正如您在下面的文件中看到的那样,我已经有了它 .. .
views.py
class AdminFichiersPhyto(CreateView):
template_name = 'phyto/phyto_admin_fichiers.html'
model = models.PhytoFile
fields = ['general_treatment', 'other']
def form_valid(self, form):
print("GONNA SAVE")
form.save()
if self.request.POST.get('autre'):
print("autre")
# gonna add some code to read the 'other' file
if self.request.POST.get('trtm_gen'):
print("traitement généraux")
# gonna add some code to read the 'general_treatment' file
phyto_admin_fichiers.html
{% block forms %}
{% if user.is_staff%}
<form method="post" action="" enctype="multipart/form-data">
<fieldset>
<div style="display: inline-block; margin-left: 22%; text-align: center"><b>Traitements généraux</b>{{ form.general_treatment }}</div>
<div style="display: inline-block; text-align: center"><b>Autres traitements</b>{{ form.other }}</div>
</fieldset>
</form>
<p style="margin-top: 2%">
<input id="submit" class="btn btn-primary" type="submit" value="Synchronisation Traitements généraux" name="trtm_gen"/>
<input id="submit" class="btn btn-primary" type="submit" value="Synchronisation Autre" name="autre"/>
</p>
{% endif %}
{% endblock %}
forms.py
class PhytoFileForm(forms.ModelForm):
class Meta:
model = models.PhytoFile
fields = ['general_treatment', 'other']
def __init__(self, *args, **kwargs):
super(PhytoFileForm, self).__init__(*args, **kwargs)
models.py
class PhytoFile(models.Model):
date = models.DateTimeField("Date", default = datetime.datetime.now)
general_treatment = models.FileField("Traitements généraux", upload_to='fichiers_phyto/', blank=True, null=True)
other = models.FileField("Autres traitements", upload_to='fichiers_phyto/', blank=True, null=True)
class Meta:
verbose_name = "Liste - Fichier phyto"
verbose_name_plural = "Liste - Fichiers phyto"
def __str__(self):
return str(self.date)
但是,即使它不能通过表单工作,我也可以通过管理页面上传文件。
我真的希望你们中的一个人能找到帮助我的解决方案,我现在已经被困了一段时间......
编辑 在 Akhilendra 回答后
我有最新的代码:
views.py
class AdminFichiersPhyto(View):
template_name = 'phyto/phyto_admin_fichiers.html'
form = forms.PhytoFileForm()
def get(self, request):
return render(request, self.template_name, {'form': self.form})
def post(self, request):
form = forms.PhytoFileForm(request.POST, request.FILES)
form.save()
return render(request, self.template_name, {'form': self.form})
phyto_admin_fichiers.html
{% block forms %}
{% if user.is_staff%}
<form method="post" action="" enctype="multipart/form-data">
{% csrf_token %}
<fieldset>
<div style="display: inline-block; margin-left: 22%; text-align: center"><b>Traitements généraux</b>{{ form.general_treatment }}</div>
<div style="display: inline-block; text-align: center"><b>Autres traitements</b>{{ form.other }}</div>
</fieldset>
<p style="margin-top: 2%">
<input id="submit" class="btn btn-primary" type="submit" value="Synchronisation Traitements généraux" name="trtm_gen"/>
<input id="submit" class="btn btn-primary" type="submit" value="Synchronisation Autre" name="autre"/>
</p>
</form>
{% endif %}
{% endblock %}
forms.py 和 models.py 没有变化
编辑解决方案
我们通过 Akhliendra 深入研究了我的问题,最终发现问题出在模板的继承上,它会覆盖 enctype="multipart/form-data"
。因此,为了解决这个问题,我创建了父模板的副本,并在覆盖表单标签中添加了 enctype
部分。希望此编辑对某些人有所帮助 ;)
第一个 submit
按钮应该在 <form>
标签内,还有 {% csrf_token %}
{% block forms %}
{% if user.is_staff%}
<form method="post" action="" enctype="multipart/form-data">
{% csrf_token %}
<fieldset>
<div style="display: inline-block; margin-left: 22%; text-align: center"> <b>Traitements généraux</b>{{
form.general_treatment }}
</div>
<div style="display: inline-block; text-align: center"><b>Autres traitements</b>{{ form.other }}</div>
</fieldset>
<p style="margin-top: 2%">
<input id="submit" class="btn btn-primary" type="submit"
value="Synchronisation Traitements généraux" name="trtm_gen"/>
<input id="submit" class="btn btn-primary" type="submit"
value="Synchronisation Autre" name="autre"/>
</p>
</form>
{% endif %}
{% endblock %}
现在来view
.
class AdminFichiersPhyto(View):
template_name = "phyto/phyto_admin_fichiers.html"
form = PhytoForm()
def get(self, request):
return render(request, self.template_name, {'form': self.form})
def post(self, request):
form = PhytoForm(request.POST, request.FILES)
form.save()
return render(request, self.template_name, {'form': self.form})
希望对您有所帮助。
我正在尝试上传一些带有 FileField
的文件,但是当我点击提交按钮并且 运行 form.save()
我的数据库中有一个新行 table 但我尝试上传的文件不存在。
我一直在寻找一些时间来解决我的问题,但我唯一看到的是关于 enctype="multipart/form-data"
,但正如您在下面的文件中看到的那样,我已经有了它 .. .
views.py
class AdminFichiersPhyto(CreateView):
template_name = 'phyto/phyto_admin_fichiers.html'
model = models.PhytoFile
fields = ['general_treatment', 'other']
def form_valid(self, form):
print("GONNA SAVE")
form.save()
if self.request.POST.get('autre'):
print("autre")
# gonna add some code to read the 'other' file
if self.request.POST.get('trtm_gen'):
print("traitement généraux")
# gonna add some code to read the 'general_treatment' file
phyto_admin_fichiers.html
{% block forms %}
{% if user.is_staff%}
<form method="post" action="" enctype="multipart/form-data">
<fieldset>
<div style="display: inline-block; margin-left: 22%; text-align: center"><b>Traitements généraux</b>{{ form.general_treatment }}</div>
<div style="display: inline-block; text-align: center"><b>Autres traitements</b>{{ form.other }}</div>
</fieldset>
</form>
<p style="margin-top: 2%">
<input id="submit" class="btn btn-primary" type="submit" value="Synchronisation Traitements généraux" name="trtm_gen"/>
<input id="submit" class="btn btn-primary" type="submit" value="Synchronisation Autre" name="autre"/>
</p>
{% endif %}
{% endblock %}
forms.py
class PhytoFileForm(forms.ModelForm):
class Meta:
model = models.PhytoFile
fields = ['general_treatment', 'other']
def __init__(self, *args, **kwargs):
super(PhytoFileForm, self).__init__(*args, **kwargs)
models.py
class PhytoFile(models.Model):
date = models.DateTimeField("Date", default = datetime.datetime.now)
general_treatment = models.FileField("Traitements généraux", upload_to='fichiers_phyto/', blank=True, null=True)
other = models.FileField("Autres traitements", upload_to='fichiers_phyto/', blank=True, null=True)
class Meta:
verbose_name = "Liste - Fichier phyto"
verbose_name_plural = "Liste - Fichiers phyto"
def __str__(self):
return str(self.date)
但是,即使它不能通过表单工作,我也可以通过管理页面上传文件。 我真的希望你们中的一个人能找到帮助我的解决方案,我现在已经被困了一段时间......
编辑 在 Akhilendra 回答后
我有最新的代码:
views.py
class AdminFichiersPhyto(View):
template_name = 'phyto/phyto_admin_fichiers.html'
form = forms.PhytoFileForm()
def get(self, request):
return render(request, self.template_name, {'form': self.form})
def post(self, request):
form = forms.PhytoFileForm(request.POST, request.FILES)
form.save()
return render(request, self.template_name, {'form': self.form})
phyto_admin_fichiers.html
{% block forms %}
{% if user.is_staff%}
<form method="post" action="" enctype="multipart/form-data">
{% csrf_token %}
<fieldset>
<div style="display: inline-block; margin-left: 22%; text-align: center"><b>Traitements généraux</b>{{ form.general_treatment }}</div>
<div style="display: inline-block; text-align: center"><b>Autres traitements</b>{{ form.other }}</div>
</fieldset>
<p style="margin-top: 2%">
<input id="submit" class="btn btn-primary" type="submit" value="Synchronisation Traitements généraux" name="trtm_gen"/>
<input id="submit" class="btn btn-primary" type="submit" value="Synchronisation Autre" name="autre"/>
</p>
</form>
{% endif %}
{% endblock %}
forms.py 和 models.py 没有变化
编辑解决方案
我们通过 Akhliendra 深入研究了我的问题,最终发现问题出在模板的继承上,它会覆盖 enctype="multipart/form-data"
。因此,为了解决这个问题,我创建了父模板的副本,并在覆盖表单标签中添加了 enctype
部分。希望此编辑对某些人有所帮助 ;)
第一个 submit
按钮应该在 <form>
标签内,还有 {% csrf_token %}
{% block forms %}
{% if user.is_staff%}
<form method="post" action="" enctype="multipart/form-data">
{% csrf_token %}
<fieldset>
<div style="display: inline-block; margin-left: 22%; text-align: center"> <b>Traitements généraux</b>{{
form.general_treatment }}
</div>
<div style="display: inline-block; text-align: center"><b>Autres traitements</b>{{ form.other }}</div>
</fieldset>
<p style="margin-top: 2%">
<input id="submit" class="btn btn-primary" type="submit"
value="Synchronisation Traitements généraux" name="trtm_gen"/>
<input id="submit" class="btn btn-primary" type="submit"
value="Synchronisation Autre" name="autre"/>
</p>
</form>
{% endif %}
{% endblock %}
现在来view
.
class AdminFichiersPhyto(View):
template_name = "phyto/phyto_admin_fichiers.html"
form = PhytoForm()
def get(self, request):
return render(request, self.template_name, {'form': self.form})
def post(self, request):
form = PhytoForm(request.POST, request.FILES)
form.save()
return render(request, self.template_name, {'form': self.form})
希望对您有所帮助。