簡體   English   中英

在Django模板中訪問模型數據

[英]Accessing model data in Django template

我正在使用以下幾行將數據傳遞到模板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)。 我該如何實現? 如何在此處將視圖按鈕與相應的行綁定?

首先要了解的是,模板渲染發生在服務器上,而用戶看不到瀏覽器中的任何東西。 模板不發送給用戶,僅發送給模板生成的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 %} 

其中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來完成,因為需要與客戶端交互的模式對話框。

您需要編寫自定義模板標簽,該標簽將帶有queryset和過濾參數並返回適當的對象,您可以使用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我僅假設條件嚴格才返回第一個對象,請根據需要進行更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM