For循环进入模板中的js对象

时间:2019-10-13 11:06:39

标签: django

我想遍历从django视图返回的对象,以在表中动态创建列(每列都是模型中的一个字段,并且我希望能够在不更改模板的情况下切换模型)

在模板的html主体部分中,相同的确切代码可以正常工作,而在脚本部分中则不能。

我的猜测是将zip对象作为迭代器传递,并且只能使用一次?如果是这样,我如何让Django发送普通列表对象?

这是我的观点:

def HelperColumnesFieldsAndNames(data):
    columns = { '<ManyToOneRel: client.paymentdata>':["unimp_pay","unimplemented"],
'<ManyToOneRel: client.subscribtiondata>':["subscribtiondata","unimplemented"],
'<ManyToOneRel: client.calldata>':["calldata","unimplemented"],
'<ManyToOneRel: client.extracommunicationdata>':["extracommunicationdata","unimplemented"],
'client.Client.creation_date':["creation_date","Creation Date"],
'client.Client.first_name':["first_name","First Name"],
'client.Client.last_name':["last_name","Last Name"],
'client.Client.address':["address","Address"],
'client.Client.city':["city","City"],
'client.Client.phone_number':["phone_number","Main Phone"],
'client.Client.creator_of_user':["creator_of_user","Client Creator"],
'client.Client.status':["status","Status"],
'client.Client.status_change_time':["status_change_time","Last Time Status Changed"],
'client.Client.allocated':["allocated","Currently Allocated To Talpan"],
'client.Client.group':["group","Owner Group"],
'client.Client.tags':["tags","Tags"],
'client.Client.tagged_items':["tagged_items","Tagged Item"],
    }

    column_name = []
    column_field = []

    for field in data:
        field = str(field)
        if field in columns.keys():
            column_field.append(columns[field][0])
            column_name.append(columns[field][1])


    return zip(column_name, column_field)

# view function
def AllClientts(request):
    user_groups = []
    for groups in request.user.groups.all():
        if groups.name != MANGER_GROUP_NAME:
            user_groups.append(groups)

    # get all object that belongs to the requested user groups
    tableData =  Client.objects.filter(group__in=user_groups)

    return render(request, "client/clients.html", {"objects": tableData, "columns_name":HelperColumnesFieldsAndNames(Client._meta.get_fields()) })

脚本示例中没有的工作示例

{% block content %}
<div class="d-flex  pt-5 pb-2">

<!-- Need to be set to colums initials names using django -->
<div class="dropdown">
    <button class="btn btn-secondary dropdown-toggle" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
        Show
    </button>

    <div class="dropdown-menu" aria-labelledby="dropdownMenuButton" id="swichable_column">
        <!--reate fileds name and Showable names -->
        {% for name in columns_name %}
            <div class="checkbox">
                <label>
                    <input type="checkbox" checked="checked" class="chackable_name" value="{{ name.1 }}">{{ name.0 }}</label>
            </div>
        {% endfor %}
    </div>
</div>
</div>


<div id="example-table"></div>


{% endblock content %}

我的tamplet中的脚本部分-即使使用相同的代码也无法正常工作

<script>

    //define some sample data
 var tabledata = [
    {id:1, first_name:"Oli Bob", age:"12", col:"red", dob:""},
    {id:2, name:"Mary May", age:"1", col:"blue", dob:"14/05/1982"},
    {id:3, name:"Christine Lobowski the gratest and latest", age:"42", col:"green", dob:"22/05/1982"},
    {id:4, name:"Brendon Philips", age:"125", col:"orange", dob:"01/08/1980"},
    {id:5, name:"Margret Marmajuke", age:"16", col:"yellow", dob:"31/01/1999"},
 ];

 $(function() {
    var table = new Tabulator("#example-table", {
    height:205, // set height of table (in CSS or here), this enables the Virtual DOM and improves render speed dramatically (can be any valid css height value)
    data:tabledata, //assign data to table
    layout:"fitColumns",
    pagination:"local",
    paginationSize:6,
    paginationSizeSelector:[3, 6, 8, 10],
    columns:[ //Define Table Columns

        {% for name in columns_name %}
            {title:"{{ name.0 }}", field:"{{ name.1 }}", align:"center", cellClick:function(e, cell){alert("cell clicked - " + cell.getValue())}},
        {% endfor %}

    ]});




</script>

1 个答案:

答案 0 :(得分:2)

显然,如果我直接返回zip对象,它是可读取的并且只能被使用一次。

我将zip()替换为list(zip()),并解决了该问题