【问题标题】:How to use Django views and template tag simultanosly?如何同时使用 Django 视图和模板标签?
【发布时间】:2012-06-20 19:57:25
【问题描述】:

在我的 Django 模板中:

<div class="A">
    {% url renders_data object.id %}
</div>
<div class="B">
    {% render_data object.id %}
</div>

Div A 是在views.py 中调用方法的常用方法,而 Div B 用于模板标签。

用户将打开一个链接。假设:/myapp/test/ 将打开一个页面,该页面包含两个模板标签部分。这个标签的名字是render_data 我想用Ajax 将数据加载到每个模板标签中。要使用它,我们需要request.ajax:。这就是为什么我想写视图方法。我想用以下方式完成它:

  • 我在views.py 中编写了template tag 的精确副本(带有传递object_id 参数的renders_data)并将其渲染到正确的模板。当我从模板中删除div A 后打开maypp/test。它在除数据之外的每个模板标签部分(每个角)中显示URL (myapp/test/&lt;object_id&gt;)。除了这个 URL See the image when i choose this option,他们是否有可能显示上下文
  • 其次,我还考虑在模板标签 (render_data) 中导入视图方法 (renders_data)。这样数据将显示在每个角落,request.Ajax: 也将起作用。如果这是可能的,那怎么办?
  • 我无法解决这个问题。请帮帮我:(

    查看 render_data 的样子:

     @register.simple_tag
     def render_widget(object_id):
         from myapp.plugins.model import Widgetsetting
         widget_setting = Widetsetting.objects.get(id = object_id)
         widget = widget_settings.get_widget()
         template_name = widget.template_name
         context = widget.context(widget=widget_settings)
         t =  get_template("widgets/%s" % template_name)
         return t.render(Context(context))
    

    【问题讨论】:

    • 不明白你的问题!如果您需要 ajax 调用,请为其编写代码。请详细说明您的尝试以及即将发生的错误?
    • @Ahsan 我想用 Ajax 加载模板标签中的数据。我该怎么做?这是我的问题。所以对此我尝试了两种方法并且没有发生错误(我已经在问题中提到过)。当我尝试使用第一个时,它会在 Django 模板的模板标签部分显示我的 URL。
    • @Ahsan 查看第一个选项的图片(已更新)
    • 能否请您发布您的render_data 模板标签的代码...是simpletaginclusiontag 还是用RenderDataNode 类等完成了很长的路要走?跨度>
    • 您的 Dropbox 链接无效

    标签: python django django-views django-templates


    【解决方案1】:

    从您发布的代码中,类似下面的内容应该可以工作...

    在views.py中:

    from django.http import HttpResponse
    from netadmin.plugins.templatetags.widgets import render_widget
    
    def ajax_render_data(request, object_id):
        return HttpResponse(render_widget(object_id))
    

    在您的 django 模板中:
    (你说你想要页面上的几个,所以我将在 django 模板中使用一个循环,我不知道你的小部件集合被称为什么,但我相信你可以为你的特定案例)

    <div class="widgets-container">
        {% for widget_settings in widgetsettings.objects.all %}
        <div class="widget-content" id="widget-content-{{ widget_settings.pk }}">
            not loaded yet
        </div>
        {% endfor %}
    </div>
    
    <script>
    // here we use django to render the ajax urls into an object
    // in javascript so we can use it on the client side 
    var ajax_urls = {
      {% for widget_settings in widgetsettings.objects.all %}
        "{{ widget_settings.pk }}: "{% url ajax_render_data widget_settings.pk %}"{% if not forloop.last %},{% endif %}
      {% endfor %}
    };
    
    // (I'll assume you're using jQuery)
    // start the ajax calls when the page is loaded:
    $(document).ready(loadWidgets());
    
    function loadWidgets() {
        // loop over the urls we provided from django:
        jQuery.each(ajax_urls, function(widget_id, url) {
            // do the ajax call:
            $.get(url, function(data) {
                // put the content into the widget div:
                $('#widget-content-'+widget_id).html(data);
            });
        });
    }
    </script>
    

    在 urls.py 中:

    urlpatterns += patterns('netadmin.plugins.ajax_view',
        url(r'^ajax/(?P<object_id>\d+)/$', 'ajax_render_data', name='ajax_render_data'),
    )
    

    【讨论】:

    • 这应该写在views.py中。难道Ajax部分也是用这个方法写的?。我应该打开这个 ajax_render_data 链接的另一件事有不同的 url 模式,并且模板标签也有不同。我的意思是说有一个 base.html 存在。我在其中添加模板标记代码 {{render_data object.id}}。如果我打开这个,那么视图部分将如何工作?
    • 查看编辑后的答案。如果您只想通过 ajax 加载内容,则可以从 html 模板中省略 {% render_widget widget_settings.pk %}
    • 感谢您在这个问题上给予的时间。我有最后一个问题,是的,我只想加载 Ajax,但我对此有疑问如果我删除 {% render_widget...%} 那么数据将如何显示在模板上。 JS 仅用于从给定的 url 连续获取数据,即 { url ajax_rener...}。意思是这个 url 返回 HttpResponse(render_widget(object_id))。现在我们进入 render_widget 方法,最后它返回 t.render(Context...)。然后它需要在模板中的某个地方来加载它。
    猜你喜欢
    • 1970-01-01
    • 2019-09-26
    • 2013-10-04
    • 2012-10-31
    • 2014-03-20
    • 2013-05-12
    • 2011-04-22
    • 2011-07-28
    • 2022-11-25
    相关资源
    最近更新 更多