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.pymodels.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})

希望对您有所帮助。