2012-02-27 28 views
15

Cách Django tạo mẫu tái sử dụng là gì?Làm cách nào để tạo mẫu có thể sử dụng lại ở Django?

Ví dụ: Giả sử nhiều trang của tôi chứa hộp "Tin mới nhất" và tuân theo nguyên tắc DRY, tôi muốn xác định nó một lần và sử dụng lại nó ở các trang khác. Làm thế nào tôi sẽ làm điều này với Django (hoặc Jinja2) mẫu?

Đọc qua Django's Template Documentation Tôi có ấn tượng rằng Django mẫu cung cấp "từ trên xuống" thừa kế nơi các tiểu mẫu tự xác định, trong đó siêu mẫu nó sẽ được nhúng:

<!-- Super-template (not valid, for illustration): --> 
<html> 
    <head><title>Title</title></head> 
    <body>{% block content %}{% endblock %}</body> 
</html> 
<!-- Sub-template: --> 
{% extends "base.html" %} 
{% block content %} 
<div class="latest-news">News</div> 
{% endblock %} 

Vậy kỹ thuật để sử dụng lại một khối (mẫu con) trong một số địa điểm là gì?

+2

Sử dụng sức mạnh của [bao gồm] (https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#include). –

Trả lời

23

Cách linh hoạt nhất để sử dụng lại các đoạn mẫu là define an inclusion_tag. Bạn có thể chuyển các đối số cho thẻ tùy chỉnh của bạn, xử lý chúng một chút bằng Python, sau đó trả về một mẫu. Direct inclusion chỉ hoạt động đối với các đoạn không phụ thuộc vào ngữ cảnh xung quanh.

dụ nhanh từ các tài liệu:

Trong app/templatetags/poll_extras.py đăng ký thẻ với một decoration:

from django import template 
register = template.Library() 

@register.inclusion_tag('results.html') 
def show_results(poll): 
    choices = poll.choice_set.all() 
    return {'choices': choices} 

Trong app/templates/results.html:

<ul> 
{% for choice in choices %} 
    <li> {{ choice }} </li> 
{% endfor %} 
</ul> 

Gọi tag:

{% load poll_extras %} 
{% show_results poll %} 
+0

Một ưu điểm của phương thức '{% include" xyz.html "%}' là bạn có thể xác định mẫu nào [trong một biến] (https://docs.djangoproject.com/en/dev/ref/templates/builtins/ #include), ví dụ: '{% include template_name%}', trong đó 'template_name' là biến giữ tên của mẫu. Có cách nào để làm điều này với một thẻ bao gồm? Hoặc là cách tốt nhất để đặt thẻ bao gồm trong mẫu bạn đang đưa vào? Ví dụ, trong mẫu cấp cao nhất có '{% include template_name%}' thì lồng trong khuôn mẫu được trỏ tới bởi 'template_name' có' {% load poll_extras%} {% show_results poll%} '. – Chris

7

Những gì bạn đang tìm kiếm, là {% include "template.html"%} từ Django docs.

9

Nếu bạn cần sử dụng {% block %}, bạn chỉ có thể thực hiện điều đó thông qua phương thức {% extend %}. Nếu không, bạn có thể sử dụng {% include 'some.html' %} để bao gồm một chút HTML ở nhiều nơi.

1

Các không chính thức Django Reusable App Conventions khuyến cáo sử dụng các tên khối:

  • {% block title %}
  • {% block extra_head %}
  • {% block body %}
  • {% block menu %}
  • {% block content %}
  • {% block header %} {% block footer %}
  • {% block body_id %} {% block body_class %}
  • {% block [section]_menu %} {% block page_menu %}

Nếu tất cả mọi người bị mắc kẹt với những công ước, nó sẽ làm cho vấn đề này dễ dàng hơn. Theo liên kết để xem mô tả của từng khối.

Các vấn đề liên quan