将 django 模板变量传递给 js 数据表

Posted

技术标签:

【中文标题】将 django 模板变量传递给 js 数据表【英文标题】:Passing django template variables to js datatables 【发布时间】:2018-12-26 18:47:23 【问题描述】:

您好,我想使用 JS 数据表库创建表。

将模板中的值传递给 js 脚本时遇到问题。 我从要显示的表中创建了 JSON 对象。 它已正确传递给模板,当我显示它时一切都很好,但是当试图将它传递给脚本时什么也没发生,我得到了空表。

我就是这样做的:

class VotesList(generic.ListView):
    model = Vote
    template_name = 'votes-list.html'
    def get_context_data(self, **kwargs):
        votes = Vote.objects.all().values('user', 'group', 'council')
        votes_json = json.dumps(list(votes))
        context = super(VotesList, self).get_context_data(**kwargs)
        context['orderby'] = self.request.GET.get('orderby', 'created_date')
        context['json_data'] = votes_json

    return context

模板:

% block javascript %
% load static %

<script type="text/javascript">
$(document).ready(function() 

    var json=JSON.parse(' json_data | safe ');
    $('#votes_list').DataTable(
       data: json,
        columns:[
         title: "user" ,
         title: "group" ,
         title: "council" ]
     );
;

</script>

% endblock %

% block content %

    <p> json_data | safe </p> <<< here data is printed fine
    % if vote_list %

        <table id="votes_list" class="display", style="width:100%">
            <thead>
                <tr>
                    <th>Właściciel</th> 
                    <th>Grupa</th> 
                    <th>Rada</th> 
                </tr>
            </thead>

        </table>

    % else %
        <p>Brak głosowań!</p>
    % endif %

% endblock %

输出数据如下所示:

["user": 2, "group": 1, "council": 1, "user": 2, "group": 2, "council": 1, "user": 3, "group": 1, "council": 1, "user": 2, "group": 1, "council": 1, "user": 2, "group": 2, "council": 2, "user": 1, "group": 1, "council": 2, "user": 3, "group": 1, "council": 1, "user": 2, "group": 1, "council": 1, "user": 1, "group": 1, "council": 2, "user": 1, "group": 2, "council": 1, "user": 1, "group": 1, "council": 1, "user": 1, "group": 1, "council": 1]

我的第二个问题是关于其他的: 我存储了大量信息作为选择:

STATUS_INACTIVE = 0
STATUS_ACTIVE = 1
STATUS_FINISHED = 2
STATUS_CHOICES = (
    (STATUS_INACTIVE, 'Inactive'),
    (STATUS_ACTIVE, 'Active'),
    (STATUS_FINISHED, 'Finished'),
)

如何将不是数字而是这个人类可读的值('Inactive')传递给上面的 JSON?

【问题讨论】:

对于第二个问题,您可以尝试 get_status_display。对于您的第一个问题,您为什么要转换为 json?为什么不直接将上下文呈现为表格? 表是什么意思?那么如何将其传递给 JS? 【参考方案1】:

对于第一个问题,尝试在&lt;/thead&gt; 标记后添加&lt;tbody&gt;&lt;/tbody&gt;。重新运行代码。

要使 DataTables 能够增强 HTML 表格,表格必须是有效的、格式良好的 HTML,具有标题 (thead) 和单个正文 (tbody)

还有另一种更简单的方式来呈现数据表。 view.py -

context['json_data'] = votes # no need to use json.dumps

在 html-

   <table id="votes_list" class="display", style="width:100%">
        <thead>
            <tr>
                <th>Właściciel</th> 
                <th>Grupa</th> 
                <th>Rada</th> 
            </tr>
        </thead>
        <tbody>
            % for data in json_data %
                <tr> data.user </tr>
                <tr> data.group  </tr>
                <tr> data.council  </tr>
            % endfor %
        </tbody>
   </table>

    <script type="text/javascript">
        $(document).ready(function() 
            $('#votes_list').DataTable();
        
    </script>

第二个问题-

% if data.user == 1 %
   Active
% elif data.user == 2%
   Inactive
% else %
   Finished
% endif %
OR 
% if data.group == 1 %
    status_dict.0 
% elif data.group == 2%
    status_dict.1 
% else %
    status_dict.2 
% endif %

>>>status_dict = dict(STATUS_CHOICES)
0: 'Inactive', 1: 'Active', 2: 'Finished'

在数据表中 - 您可以应用相同的逻辑。例如-

  "columns": [
     "data": "engine" ,
     "data": "browser" ,
    
      "data": "platform",
      "render": function(data, type, row, meta)  
                      if(true)
                          return “display this” 
                      ;
                      return “false"
    
  ]

【讨论】:

【参考方案2】:

如果您像这样在视图中传递数据

class VotesList(generic.ListView):
    model = Vote
    template_name = 'votes-list.html'

    def get_context_data(self, **kwargs):
        context = super(VotesList, self).get_context_data(**kwargs)
        context['votes'] = Vote.objects.all()
        return context

然后在你的模板中你可以有


% block javascript %
    % load static %
    
    <script type="text/javascript">
    $(document).ready(function() 
        $('#votes_list').DataTable(
           
        );
    );
    
    </script>
    
    % endblock %
    
    % block content %
    
        % if vote_list %
    
            <table id="votes_list" class="display", style="width:100%">
                <thead>
                  <th>Właściciel</th> 
                  <th>Grupa</th> 
                  <th>Rada</th> 
                </thead>
                <tbody>
                  % for vote in votes %
                    <tr>
                      <td> vote.user </td>
                      <td> vote.group</td>
                      <td> vote.countcil </td>
                    <tr>
                  % endfor %
                </tbody>
            </table>
    
        % else %
            <p>Brak głosowań!</p>
        % endif %
    
    % endblock %

它应该呈现为 JS 数据表

【讨论】:

嗯,是的,你说得对,但我想用“child-row”制作表格datatables.net/examples/api/row_details.html 当我点击行时,它将显示有关对象的更多信息。并非所有列都在开始时显示,但只有少数列,单击时会显示更多信息。所以我停止使用这个子行将这个变量传递给 json。所以你的解决方案在这里也应该没问题? 是的,这个解决方案应该可以工作,也可以作为 json 传递。我认为这种方式更直接。当您填充子行时,您可以在 javascript 中以相同的方式插入变量;使用 vote.something 【参考方案3】:

对于您的第一个问题,我会将您的模板变量存储在一个 JavaScript 变量中,例如 var data = " template_var ",然后在您现在尝试使用它的地方使用该新变量。然后你应该能够处理你正在尝试做的事情。

请注意,其他答案会告诉您只创建一个表,但我知道您正在使用 DataTables,此外,如果您尝试在表中加载超过 50 个对象,您可能会遇到加载速度问题。因此,做您正在做的事情可能会很好,这将允许您使用 AJAX 并检索下一组使用分页的数据。这是可以在将来对应用程序进行校对时解决的问题。

【讨论】:

是的,我读过有关 ajax 的文章,但真的不知道如何开始 嗯,我使用 dump: json.dumps(list(votes)) 传递给模板,当我做 var data = " json_data | safe " 时它仍然一样 所以,django 中的 ajax 非常简单,到处都有教程。关于其他评论,问题可能在于它被识别为字符串并且没有从您的 JSON.parse 中正确解析。尝试控制台记录新的 js 变量并在此处响应。附带说明一下,您应该做的只是渲染没有数据的模板,然后当页面准备好时,执行 AJAX 调用并返回一个 JsonResponse 对象,该对象是 Django 的一部分。然后,您可以轻松地将数据从 Javascript 放入表中。这将缓解大量数据的加载缓慢问题。

以上是关于将 django 模板变量传递给 js 数据表的主要内容,如果未能解决你的问题,请参考以下文章