在Django模板

时间:2017-07-26 19:17:43

标签: python django django-models django-forms django-templates

我使用以下行将数据传递给我的模板index.html,model1是我的models.py中的类。

     data = model1.objects.all()
     return TemplateResponse(request, 'index.html', {'data': data})

我可以使用for循环访问前端的数据,如下所示

 {% for x in data %}
   <h3>{{x.name}}</h3>
   <h4>{{x.department}}</h4>
 {% endfor %}

由于此数据中存在多个对象,我的问题是,如果我只想访问具有特定名称的特定对象的部门,我该怎么做?

例如,我在这里使用for循环,考虑数据中有两个对象。那么输出就是

name1
department1
name2
department2

所以现在如果我只需要访问name2而没有任何循环,我该怎么做?

更新问题:我正在使用html更新此问题,以便问题看起来很清楚。

table id="example" class="table table-striped" cellspacing="1" width="100%">
    <thead>
  <tr>
    <th>ID</th>
    <th>Name</th>
    <th>Department</th>
    <th>View/Edit</th>
  </tr>
</thead>
<tbody>
  {% for x in data %}
  <tr>
    <td>{{x.id}}</td>
    <td>{{x.name}}</td>
    <td>{{x.department}}</td>
    <td>View</td>
  <button type="button" class="btn-sm btn-primary btn-lg" data-toggle="modal" data-target="#myModal">
  view</button></td>
  </tr>
  {% endfor %}

</tbody>

这就是我的html外观,我在这里使用数据表。因此,所有数据都会自动在表格中捕获。正如您所看到的,每一行都有一个我将实现的视图按钮。一旦用户点击了视图按钮,我就会弹出一个模态对话框来显示我不会在表格中显示的所有其他详细信息,例如{{x.dateJoined}}等。但是如果我使用单独的视图来弹出这个对话框,我应该从我的模板向视图发送一个请求,说明用户点击了哪一行(带有一些ID)。我怎样才能实现这一目标?如何将视图按钮与相应的行绑定在一起?

2 个答案:

答案 0 :(得分:0)

首先要理解的是,在用户在浏览器中看到任何内容之前,模板呈现会发生在服务器上。模板不会发送给用户,只会发送模板生成的HTML。当用户与页面交互时,不涉及原始模板。所以,你有两个选择:

  1. 您可以在页面上的隐藏div中呈现所有对象的数据,然后使用javascript与jquery对话框一起按需显示它们。如果您的记录很少,这是现实的。

  2. 您可以使用自己的模板创建第二个视图,该模板仅呈现模式对话框内容的HTML。然后,您可以再次使用javascript / jquery发出一个AJAX请求,以便在需要时加载对话框的内容。在您的第一个视图模板中,部门列表包括您要获取的对象的URL,例如:

    {% for x in data %}
    <tr>
    <td>{{x.name}}</td>
    <td><a class="deptlink" href="{% url 'dept_detail' x.pk %}">
        {{ x.department }}</a></td>
    </tr>
    {% endfor %}
    
  3. 其中dept_detail是视图的urls.py条目的名称,用于提供对话框的内容。

    然后在您的javascript中,勾选a标记,以便打开对话框而不是离开页面:

         $('.deptlink').click(function (event) {
             event.preventDefault();
             # then the code after this is up to you, but something that'll
             # load the url into your dialog and open it.
             $('yourdialog').load($(event.target).attr('href'));
    

    既然你说你是javascript的中间人我不会深入了解实现的细节,但基本上,故事的寓意是django的输出将是一个HTML页面。您需要在客户端进行的任何操作都必须在该页面中,否则您将不得不向服务器发出另一个请求以获取它...无论哪种方式,您都需要一些javascript来执行此操作,因为你想要一个与客户端交互的模态对话框。

答案 1 :(得分:0)

您需要编写自定义模板标记,它将获取查询集和过滤参数并返回适当的对象,您可以使用simple_tag

<强>的myapp / templatetags / myapp_tags.py

from django import template

register = template.Library()


@register.simple_tag
def get_model1_object(queryset, **filters):
    if not filters:
        raise template.TemplateSyntaxError('`get_model1_object` tag requires filters.')
    retrun queryset.filter(**filters).first()

然后在模板中:

{% load get_model1_object from myapp_tags %}

{% get_model1_object data name='blah' as obj %}

注意 :您的过滤条件可能会产生多个结果,但在get_model1_object我只返回第一个对象,假设您的标准是严格的,根据您的需要进行更改。