Как вызвать шаблон django, чтобы использовать его через Jquery? - PullRequest
1 голос
/ 11 марта 2011

Я установил приложение django-newsletter и настроил форму подписки.Но сейчас я хотел бы распечатать его через наложение Jquery вместо плоской страницы, содержащей эту форму.Проблема в том, что я не знаю, как включить эти элементы плоских страниц в каждую страницу, где будет присутствовать ссылка, вызывающая наложение;и я не знаю, какой подход будет наиболее эффективным.

Пожалуйста, осветите мой путь :) Спасибо!

Ответы [ 3 ]

2 голосов
/ 11 марта 2011

Создайте представление Django, которое отображает только HTML-код формы, используя предпочитаемый вами шаблон. Затем используйте $ .ajax () с dataType: "html", чтобы получить код формы для использования в оверлее.

1 голос
/ 11 марта 2011

Так что этот вид более подробно раскрывает то, что предложил @Nathan.

Возьми один

Во-первых, вы можете опубликовать форму подписки в каждом шаблоне, где, по вашему мнению, пользователь щелкнет ссылку подписки на рассылку. Форма скрыта и будет представлена, когда наложение вызовет ее отображение.

{# newsletter_subscribe_request_form_overlay.html #}

{% if newsletter_subscribe_request_form %}
  <div id="newsletter_subscribe_request_form_overlay" class="simple_overlay">
    <form action="{% url newsletter_subscribe_request %}" method="POST">
      {{ newsletter_subscribe_request_form.as_p }}
      <input type="submit" value="Subscribe to the newsletter" />
      {% csrf_token %}
    </form>
  </div>
{% endif %}

{# now, in the templates where the overlay action link will be present #}
{# ...at the very bottom, just before the `BODY` element closing tag #}

{% include 'newsletter_subscribe_request_form_overlay.html' %}

Хорошо, так что это позволит вам разместить скрытую форму подписки на любой странице, где вы хотели бы представить ее с наложением. Теперь осталось добавить newsletter_subscribe_request_form в контекст шаблона. Вы можете сделать это, либо обновив представления, чтобы добавить форму в контекст, либо создать контекстный процессор. Лично я бы предпочел контекстный процессор:

from newsletter.models import Subscription
from newsletter.forms import SubscribeRequestForm

def newsletter_subscribe_request_form_overlay(request):
    '''
    Inserts a newsletter subscribe request form into the context
    for every user that's not yet subscribed.
    '''

    try:
        Subscription.objects.get(user=request.user)
        # object exists, user is already subscribed
        return {} 
    except Subscription.DoesNotExist:
        # object doesn't exist, push the form to the context
        return {'newsletter_subscribe_request_form': SubscribeRequestForm()}
    except:
        # something unexpected happened, or I messed up
        return {}

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

Обратной стороной является то, что, в зависимости от вашей команды или личных предпочтений, это может быть слишком много волшебства, чтобы справиться. Если вы не документируете подход где-то, будет немного не интуитивно понятно, откуда взялся newsletter_subscribe_request_form в контексте (представление ?; один из процессоров контекста?), И вам, возможно, придется пройти через большую строку наследования выяснить, где newsletter_subscribe_request_form_overlay.html был включен. Не говоря уже о том, что вы выполняете дополнительный запрос к базе данных за запрос.

Однако для этого очень важно то, что вы также можете добавить форму отказа от подписки в контекст, если пользователь подписан, и в зависимости от того, какой из этих двух параметров присутствует, вы можете динамически изменять заголовки ссылок между «Подписаться» и «Отписаться», что будет одним из тех маленьких благ, которые вы можете дать своим пользователям.

Возьми два

Второй подход заключается в создании простого CreateView, который можно получить с помощью вызова Ajax и представить содержимое в оверлее в интерактивном режиме.

from django.views.generic.edit import CreateView
from newsletter.forms import SubscribeRequestForm
from django.http import HttpResponseBadRequest

class AjaxSubscriptionRequestView(CreateView):
     ''''
     A simple subscription create view that returns a 
     subscription form in the response for Ajax calls
     ''''

     http_method_names = ['get',]
     form_class = SubscribeRequestForm
     template_name = 'newsletter_subscribe_request_form_overlay.html'

     def get_initial(self):
         return {'user': self.request.user}

     def get(self, request, *args, **kwargs):
         if not request.is_ajax():
             return HttpResponseBadRequest()
         else:
             return super(AjaxSubscriptionRequestView, self).get(request,
                                                                 *args, **kwargs)

Итак, мы используем тот же шаблон, что и в первом примере, поэтому мы просто возвращаем форму в ответе. Теперь это просто вопрос выбора формы и представления ее в оверлее после ее получения.

<script type="text/javascript">
    function newsletterSubscribeRequestFormOverlay(eventObject) {
        eventObject.preventDefault();

        $.ajax({
            url: "{% url ajax-subscription-request %}",
            cache: false,
            success: function(html){
                $('body').append(html);
                $('.simple_overlay').overlay();
            }
        });
    }
</script>

<a href="{% url newsletter_subscribe_request %}" 
   onclick="javascript: newsletterSubscribeRequestFormOverlay(event);">
   Subscribe to our newsletter
</a>

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

0 голосов
/ 11 марта 2011

Лично я бы предпочел сделать это в ajax, но только для дальнейшего использования, если вы хотите включить html или переменные в каждый запрос, вы можете сделать это в контекстных процессорах, а для включения подшаблонов есть тег include, который вы можете использовать в базовом шаблоне.

http://docs.djangoproject.com/en/dev/ref/templates/api/#writing-your-own-context-processors

http://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#include

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...