[英]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。 當用戶與頁面交互時,不涉及原始模板。 因此,您有兩種選擇:
您可以呈現頁面上隱藏div中所有對象的數據,然后將javascript與諸如jquery對話框之類的內容一起使用以按需顯示它們。 僅當您有很少的記錄時,這才是現實的。
您可以使用其自己的模板創建第二個視圖,該模板僅呈現模式對話框內容的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.