如何调用Django模板以便通过Jquery使用它?

2024-05-15 20:19:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经安装了django时事通讯应用程序,并定制了订阅表单。但是,现在,我希望通过Jquery覆盖来打印它,而不是使用包含该表单的flatpage。 问题是,我不知道如何将这个flatpages元素包含到将出现调用覆盖的链接的每个页面中;我也不知道哪种方法最有效。在

请照亮我的路:) 谢谢您!在


Tags: django方法应用程序flatpages元素表单链接页面
3条回答

所以这类文章更详细地阐述了@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添加到模板上下文中。您可以通过更新视图来将表单添加到上下文中,也可以创建上下文处理器。就个人而言,我更喜欢上下文处理器:

^{pr2}$

所以这就结束了这个方法。这一个非常简单,因为它只包括编写一个简单的模板,包括在其他模板中,然后有一个上下文处理器将表单推送到模板上下文中,以供未订阅的用户使用。在

另一方面,取决于你的团队或个人喜好,这可能是太多的魔法难以处理。除非您在某个地方记录了该方法,否则上下文中的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表单的响应,当用户点击订阅链接时,你可以向他们提供某种形式的反馈。在

创建一个Django视图,该视图使用您的首选模板仅呈现表单的HTML。然后使用$.ajax()和数据类型:“html”来获取表单的代码,以便在覆盖中使用。在

就我个人而言,我更喜欢用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

相关问题 更多 >