首页 > 解决方案 > 无法从我的视图中显示表单

问题描述

我正在尝试创建一个页面,管理员可以在其中使用一些FileField. 问题是我无法显示表单中的任何字段,我一定遗漏了一些重要的东西,但我找不到什么,希望有人能帮助我。

这是与此表单相关的代码:

网址.py

urlpatterns = patterns(
    '',
    url(r'^admin_fichiers_phyto/$', phyto_views.AdminFichiersPhyto.as_view(), name='phyto-admin-fichiers-phyto'), 
)

phyto_admin_fichiers.html

{% block forms %}

{% if user.is_staff%}

    <fieldset>
        <div>
            <span>{{ form.other }}</span>
        </div>
    </fieldset>

    <p>
     <input id="submit" class="btn btn-primary" type="submit" value="Synchronisation Autre" name="autre"/>
     <input id="submit" class="btn btn-primary" type="submit" value="Synchronisation Traitements généraux" name="trtm_gen"/>
    </p>
{% endif %}
{% endblock %}

视图.py

class AdminFichiersPhyto(TemplateView):
    template_name = 'phyto/phyto_admin_fichiers.html'
    form_class = forms.PhytoFileForm
    current_url = 'phyto-files'
    context_object_name = 'phyto_files'

    def post(self, request, *args, **kwargs):
        if request.POST.get('autre'):
            return HttpResponse('<h1>autre</h1>')
        if request.POST.get('trtm_gen'):
            return HttpResponse('<h1>Traitement Generaux</h1>')

表格.py

class PhytoFileForm(forms.Form):
    class Meta:
        model = models.PhytoFile
        fields = ['general_treatment', 'other']

    def __init__(self, *args, **kwargs):
        super(PhytoFileForm, self).__init__(*args, **kwargs)

模型.py

class PhytoFile(models.Model):
    general_treatment = models.FileField(upload_to='fichiers_phyto/', blank=True, null=True)
    other = models.FileField(upload_to='fichiers_phyto/', blank=True, null=True)

这是我的网页显示的内容:

https://imgur.com/a/yH0be0K

我不明白为什么不显示该字段,我真的希望有人有知识来帮助我解决我的问题!^_^

祝你今天过得愉快 !:D

标签: djangodjango-views

解决方案


您在这里有几个主要问题。

form_classTemplateView 对(或者context_object_name,就此而言)一无所知。通过post这样定义,您实际上避免了对上传的数据做任何事情。您需要使用处理表单的视图;在您的情况下, CreateView 将是理想的。在该视图中,该响应代码需要进入form_valid.

其次,PhytoFileForm 需要继承自forms.ModelForm; 标准的 Form 类对模型一无所知,也不使用 Meta 类。但是,由于您没有在字段选择之外自定义表单,因此您可以只依赖 CreateView 创建的自动表单。

接下来,您的模板已损坏;它没有 HTML 表单元素。此外,由于您的表单类有两个字段,但您只在模板上显示一个,因此表单永远不会有效。

所以,把它放在一起:

class AdminFichiersPhyto(CreateView):
    template_name = 'phyto/phyto_admin_fichiers.html'
    model = models.PhytoFile

    def form_valid(self, form):
        form.save()
        if request.POST.get('autre'):
            return HttpResponse('<h1>autre</h1>')
        if request.POST.get('trtm_gen'):
            return HttpResponse('<h1>Traitement Generaux</h1>')
{% block forms %}

{% if user.is_staff%}

  <form method="post" action="" enctype="multipart/form-data">
    <fieldset>
        <div>
            <span>{{ form.other }}</span>
        </div>
        <div>
            <span>{{ form. general_treatment }}</span>
        </div>
    </fieldset>

    <p>
     <input id="submit" class="btn btn-primary" type="submit" value="Synchronisation Autre" name="autre"/>
     <input id="submit" class="btn btn-primary" type="submit" value="Synchronisation Traitements généraux" name="trtm_gen"/>
    </p>
  </form>
{% endif %}
{% endblock %}

推荐阅读