django:将联系表单与文件上传和recaptcha相关联

时间:2012-05-20 01:52:18

标签: django django-models django-forms django-views

我正在使用Django为自己开发一个小型博客应用程序,我使用https://github.com/GoodCloud/django-ajax-uploader引入了一个文件上传工具。我已设法使其工作,文件上传似乎工作正常。< / p>

我现在想在文件上传的同时添加(联系)表单,但我不确定如何将表单“链接”到文件上传。所以,我的逻辑是用户填写联系表单,然后上传文件(然后显然按下“提交”)。我的问题(不确定我是否明确这一点)是,如何在联系表单内容(如姓名,电子邮件ID等)与用户使用django-ajax-uploader上传的文件之间建立链接。最有效的方法是什么?

如果有帮助,我打算使用modelForms编写(联系)表单,这显然会将字段写入数据库。但是,django-ajax-uploader不使用db,因此,我不确定如何链接这两者。另外,我已经使用以下说明在我的模型中包含了recaptcha:http://www.marcofucci.com/tumblelog/26/jul/2009/integrating-recaptcha-with-django/我看到了recapatcha,但我不确定我的函数fileup是否处理了表单。

任何关于此的指导都会很棒。感谢。

更新的代码已开启:http://dpaste.com/750619/

2 个答案:

答案 0 :(得分:1)

根据我对您的目标的理解,似乎在服务器和表单中连接上传文件的唯一方法是文件上传器本身返回的响应。

当您从ajax文件上传器获得响应时,您必须捕获上传的文件名并将其设置为表单上的隐藏文件。

您的表单可能如下所示:

class MyForm(forms.Form):
    name = forms.CharField()
    email = forms.EmailField()
    the_file = forms.CharField(widget=forms.HiddenInput())

在您的文件的Javascript代码中添加到此部分:

...
...,
onComplete: function(id, fileName, responseJSON) {
    if(responseJSON.success) {
        //Note that i add "id_" in front of field name, because django automatically add this when rendering the form.
        $('#id_the_file').val(fileName);
     } else {
        alert("upload failed!");
    }
},
...
...

至少现在,当用户提交您的联系表单时,您在表单中有文件名。

现在你的工作是在发送电子邮件时获取文件的完整URL,因为到目前为止我们只有文件名,而不是服务器上的完整文件URL。

然后您可以在邮件中提供链接或附件。

我希望它有所帮助:)和我不好的英语......

答案 1 :(得分:1)

您可以在联系表单中显示文件上传按钮的唯一方法是通过模板,您需要像这样编辑模板:

<form action="/contact/" method="post">{% csrf_token %}

{{ form.as_p }}

<!-- this block is required to show file upload button --->
<div id="file-uploader">       
   <noscript>          
       <p>Please enable JavaScript to use file uploader.</p>
   </noscript>         
</div>
<!-- end file upload button-->

<input type="submit" value="Submit" />
</form>

当您单击“提交”按钮并上载文件时,它们处于不同的请求中。您的提交表单将在您的视图中通过“ fileup ”功能处理,文件上传由“ import_uploader ”处理,您无法同时提出此请求

要使您的联系人模型也保存文件名,您必须:

  1. 首先上传文件(文件上传器POST请求)。
  2. 获取ajax文件上传器返回的文件名,并将此值设置为 你的“ fnames ”字段。(在我的上一篇文章中使用js / jquery技术 评论)。但在这种情况下,您的“ fnames ”字段将呈现为文本字段。这就是为什么我在我的上一个代码中使用HiddenInput,所以它不需要是可见的,但它就在那里。
  3. 现在您可以继续点击表单提交按钮,您的表单将会 提交文件名。 (联系表单POST请求
  4. 由于您的模型中需要 fnames ,因此您必须确保用户在提交整个表单之前已经上传了文件。