如何使用Django视图和模板标签simultanosly?

时间:2012-06-18 19:34:41

标签: python django django-views django-templates

在我的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:。这就是为什么我想写出观点方法。我想用以下方式完成它:

  • 我在template tag中写了views.py的确切副本(带有传递object_id参数的renders_data)并将其渲染到正确的模板。从模板中删除maypp/test后打开div A时。除了数据之外,它在每个模板标签部分(每个角落)中显示URLmyapp/test/<object_id>)。除了此网址See the image when i choose this option
  • 之外,他们是否有可能展示上下文

  • 其次我还想在模板标签(renders_data)中导入视图方法(render_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))
    

    1 个答案:

    答案 0 :(得分: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模板中使用一个循环,我不知道你的widget集合被调用了什么,但我相信你可以为你的特定工作情况下)

    <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'),
    )