django: связывание контактной формы с загрузкой файлов и рекапчей

Я работаю над небольшим приложением для ведения блога, используя Django, и я представил возможность загрузки файлов с помощью https://github.com/GoodCloud/django-ajax-uploader. Мне удалось заставить его работать, и загрузка файлов работает нормально.

Теперь я хотел бы добавить (контактную) форму вместе с загрузкой файла, но я не уверен, как «связать» форму с загрузкой файла. Итак, моя логика заключается в том, что пользователь заполняет контактную форму, а затем загружает файлы (а затем, очевидно, нажимает кнопку "отправить"). Мой вопрос (не уверен, что я это ясно) заключается в том, как мне сделать ссылку между содержимым контактной формы (например, имя, идентификатор электронной почты и т. д.) на файлы, которые пользователь загрузил с помощью django-ajax-uploader . Что было бы наиболее эффективным способом сделать это?

Если это поможет, я планирую написать (контактную) форму с помощью modelForms, которая, очевидно, запишет поля в базу данных. Однако django-ajax-uploader не использует базу данных, и поэтому я не уверен, как связать их обоих. Кроме того, я включил recaptcha в форму модели, следуя инструкциям на странице: http://www.marcofucci.com/tumblelog/26/jul/2009/integrating-recaptcha-with-django/ Я вижу рекапатчу, но не уверен, что моя функция fileup обрабатывает форму.

Любое руководство по этому поводу было бы здорово. Спасибо.

Обновленный код: http://dpaste.com/750619/


person JohnJ    schedule 20.05.2012    source источник


Ответы (2)


Насколько я понимаю вашу цель, кажется, что единственное, что связывает ваш загруженный файл на сервере и вашу форму, - это ответ, возвращаемый самим загрузчиком файлов.

Вы должны поймать загруженное имя файла и установить его как скрытый файл в своей форме, когда получите ответ от загрузчика файлов 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-адрес файла на вашем сервере.

затем вы можете предоставить его в виде ссылки или вложения в свою почту.

Я надеюсь, что это поможет :) и извините за мой плохой английский...

person ekaputra    schedule 20.05.2012
comment
Привет, экапутра, я обновил свой пост небольшим количеством кода. Был бы очень признателен, если бы вы могли взглянуть на него и дайте мне знать! - person JohnJ; 20.05.2012

Единственный способ, которым вы можете показать кнопку загрузки файла в своей контактной форме, — это ее шаблон, вам нужно отредактировать шаблон следующим образом:

<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 File Uploader).
  2. получите имя файла, возвращенное загрузчиком файлов ajax, и установите это значение в поле «fnames» (используя технику js/jquery в моем последнем комментарии). Но в этом случае ваше поле «fnames» будет отображаться как текстовое поле. вот почему я использую HiddenInput в своем последнем коде, поэтому он не должен быть видимым, но он есть.
  3. Теперь вы можете продолжить, нажав кнопку отправки формы, ваша форма будет отправлена ​​с именем файла. (POST-запрос контактной формы)

Поскольку fnames в вашей модели является обязательным, вы должны убедиться, что пользователь уже загрузил файл, прежде чем отправлять всю форму.

person ekaputra    schedule 20.05.2012
comment
спасибо за это, я все еще пытаюсь ясно понять, что происходит. В моей функции просмотра файлов я должен иметь строку if request.method == 'POST':? Если я раскомментирую его, моя форма больше не будет видна. - person JohnJ; 21.05.2012
comment
Я обновил свой код сейчас, как указано выше, и его на dpaste. Я использовал скрытое поле, используя поле исключения в форме модели. Однако у меня есть одна сложность в том, что я также включил recaptcha. Теперь у меня есть форма с загрузкой файла и рекапчей, и мне было интересно, как я могу интегрировать три модуля. - person JohnJ; 21.05.2012
comment
Привет, проверьте http://dpaste.com/hold/751200/, я надеюсь, что это ответит на большинство ваш вопрос. - person ekaputra; 22.05.2012
comment
Большое спасибо за это и извините за задержку, я был в пути и только что вернулся. Я постараюсь понять ваш код сегодня и попытаться реализовать это. Еще раз спасибо. - person JohnJ; 25.05.2012