0

在我的 Django 模板中:

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

DivA是调用方法的常用方法,views.py而 DivB用于模板标签。

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

  • template tag我编写了in (renders_data 并传递 object_id 参数)的精确副本views.py并将其渲染到正确的模板。当我从模板中maypp/test删除后打开。div A它在除数据之外的每个模板标签部分(每个角)中显示URL( )。myapp/test/<object_id>他们是否有可能显示除此 URL 之外的上下文当我选择此选项时查看图像
  • 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))
    
    4

    1 回答 1

    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'),
    )
    
    于 2012-06-18T21:00:46.877 回答