Django 2.0 학습(13): Django 템플릿 상속 및 정적 파일

6583 단어
Django 템플릿 상속 및 정적 파일
템플릿 상속(extend)
Django 템플릿 엔진에서 가장 강력하고 복잡한 부분은 바로 템플릿 계승이다. 템플릿 계승은 우리로 하여금 기본적인'골격'템플릿을 만들 수 있게 한다. 이것은 웹 페이지의 모든 요소를 포함하고 템플릿에 덮일 수 있는 Blocks를 정의할 수 있다.템플릿 상속을 쉽게 이해하기 위해 먼저 템플릿을 작성합니다.



    
    {% block title %}Replaceable template{% endblock %}


    
    
    
{% block content %}{% endblock %}

이 템플릿을 우리는base라고 부른다.html, 두 열의 조판 페이지에 사용할 수 있는 간단한 HTML 골격을 정의합니다.하위 템플릿은 빈 Blocks를 내용으로 채울 수 있습니다.이 예에서 Block 라벨은 템플릿 내용으로 채울 수 있는 세 개의 Block을 정의합니다. Block은 템플릿 엔진에 하위 템플릿이 템플릿의 위치를 덮어쓸 수 있음을 알려 줍니다.
그런 다음 하위 템플릿을 하나 더 작성합니다.
{% extends "polls/base.html" %}        #           app     ,         app 

{% block title %}Child template{% endblock %}

{% block content %}
    {% for entry in blog_entries %}
        

{{ entry.title }}

{{ entry.body }}

{% endfor %} {% endblock %}

extends 탭이 여기 관건입니다. 템플릿 엔진에 이 템플릿이 다른 템플릿을 계승하고 있음을 알려 줍니다.템플릿 시스템이 이 템플릿을 처리할 때 먼저 부모 템플릿을 지정합니다. 이 예에서'base.html'입니다.그때 템플릿 엔진이base를 발견했습니다.html의 세 개의 Block 탭을 하위 템플릿의 내용으로 바꿉니다.blogentries 값, 하위 템플릿이 출력하는 내용은 다음과 같습니다.



    
    Child template

 

    
 
    

Entry one

This is my first entry.

Entry two

This is my second entry.


주의: 하위 템플릿은sidebar Block을 정의하지 않았기 때문에 시스템은 부모 템플릿의 값을 사용합니다.부모 템플릿의 {% block%} 탭의 내용은 항상 예비 내용으로 사용됩니다.이런 방식은 코드를 최대한 복용하고 공유된 내용 구역에 내용을 추가하는 것을 더욱 간단하게 한다. 예를 들어 일부 범위 내의 내비게이션이다.
설명:
1. 템플릿에서 {% extends%} 탭을 사용하면 템플릿의 첫 번째 탭이어야 하며, 다른 어떤 상황에서도 템플릿 계승이 불가능합니다.2. 베이스 템플릿에 {% block%} 탭을 많이 설정하면 좋을수록 좋습니다.하위 템플릿은 모든 부모 템플릿의 Block을 정의할 필요가 없다는 것을 기억하십시오. 따라서 대부분의 > Block에 합리적인 기본 내용을 채우고 우리가 필요로 하는 것만 정의할 수 있습니다.갈고리가 많은 것이 적은 것보다 낫다.3. 우리가 대량의 템플릿에서 내용을 복제하는 것을 발견하면 부모 템플릿의 {% Block%}로 내용을 이동해야 한다는 것을 의미한다.4. 가끔은 부모 템플릿의 내용을 완전히 덮어쓰지 않고 부모 템플릿을 토대로 다른 것을 추가하고 싶을 때가 있다. 그러면 우리는 채우고 싶은 블록에 >{{{block.super}} 문장을 더하면 부모 템플릿의 물건을 남길 수 있다. 예를 들어 다음과 같다.
     
{% block title %}Parent template{% endblock %}

                    !,           
{% block title %}
    {{ block.super }}!
{% endblock %}

5. 더 좋은 가독성을 위해 {% endblock%} 탭에 이름을 붙일 수도 있습니다.예를 들면 다음과 같습니다.
{% block content %}
...
{% endblock content %} 

6. 대형 템플릿에서 이 방법은 {% Block%} 탭이 닫힌 것을 똑똑히 볼 수 있도록 도와줍니다.
마지막으로, 같은 이름의 Block 탭을 한 모델에 여러 개 정의할 수 없습니다.이 제한의 존재는 Block 라벨의 작용이 양방향이기 때문이다.이 말은 Block 라벨은 구덩이를 채우는 것을 제공할 뿐만 아니라, 부모 버전에서 구덩이를 채우는 내용을 정의했다.만약 한 템플릿에 두 개의 이름이 같은 Block 라벨이 있다면, 하위 템플릿의 부모 템플릿은 어떤 Block의 내용을 사용할지 모른다.
주의: 템플릿은 일반적으로 app 아래의templates에 놓여 있으며, Django는 자동으로 이 폴더에 가서 찾을 것입니다.만약 우리 모든 앱의templates에 index가 있다면.html, 우리가views에 있을 때.py에서 사용할 때render(request,'index.html')를 직접 쓰면 현재 app의templates 폴더에 있는 index를 찾을 수 없습니다.html 폴더는요?(정답은 반드시 가능한 것이 아니라 틀릴 수도 있다)
Django 템플릿 찾기 메커니즘: Django가 템플릿을 찾는 과정은 모든 app의templates 폴더에서 찾을 수 있습니다. (현재 app의 코드가 아니라 현재 app의templates 폴더에서만 찾을 수 있습니다.)각 앱의templates는 하나의 폴더 목록을 형성한다. Django는 이 목록을 훑어보고 하나하나 폴더를 찾는다. 어떤 폴더를 찾을 때 멈추고 모든 것이 다 훑어보고 지정된 템플릿을 찾지 못할 때 Template Not Found이다.이렇게 디자인하는 것은 이롭기도 하고 해롭기도 하다. 유리한 점은 한 앱이 다른 앱의 템플릿 파일을 사용할 수 있다는 것이다. 해로운 점은 잘못 찾을 수 있다는 것이다.그래서 우리가 사용할 때templates에 앱과 같은 이름의 폴더를 만들면 된다.모든 app의templates 폴더에 app의 이름을 다시 만들어야 합니다. 이 app와 관련된 템플릿만 app/templates/app/디렉터리 아래에 두어야 합니다.이렇게 사용할 때 앱이 이름의 일부로 되어 있어 헷갈리지 않는다.
템플릿 포함
만약 우리가 아래의 템플릿 index가 있다면.html, 코드:



    
    Title



body


웹 개발을 한 학생들은 대부분 웹 페이지의 공공 머리, 공공 밑부분 코드가 모든 페이지가 똑같다는 것을 알고 있다. 그러면 이를 단독으로 꺼내서 하나의 html로 만들어야 한다. 이렇게 이 부분 코드를 수정할 때 모든 페이지를 수정할 필요가 없기 때문에django에서 우리는 이렇게 할 수 있다.html

bottom.html

index.html
  
  
  
      
    Title  
  
  
  
{% include 'top.html' %}  
  

body

{% include 'bottom.html' %}

Django 템플릿 엔진의include 문법을 사용하여 현재 템플릿 페이지에 단독 페이지를 포함할 수 있습니다.학우들이 의문이 있다면 우리는 보기를 통해 템플릿의 상하문에 전달하고 포함된 템플릿에서 사용할 수 있습니까?다음과 같은 뷰 함수를 사용할 수 있습니다.
def index(request):  
    return render(request, 'polls/index.html', {'a': 100, 'b': 200})

이 Django 뷰 함수는 템플릿에 전달되고 템플릿을 렌더링합니다.
top.html 수정은 다음과 같습니다.
:{{ a }}
#

만약 모든 페이지가 공통된 머리 top을 사용한다면, 나는 여기에 이런 문제가 있다.htmlhtml 2.html 3.html에서 사용하는 머리는 스타일이 다르기 때문에 필요한 top입니다.html:

하지만 5.html, 6.html에서 사용하는 헤드 스타일은 다음과 같습니다.

인클로드 방식을 통해 공공 헤더를 직접 포함하면 일부 페이지가 문제를 일으킬 수 있다는 것은 명백하다.일부 파라미터가 다르기 때문에include는 우리가include의 템플릿에 파라미터를 전달할 수 있도록 허락한다. 우리는 with 문법을 사용할 수 있다. 그러면 문제 해결은 다음과 같다.
{{ % include 'top.html' with mycss='acss' % }}  

top.html 수정은 다음과 같습니다.

템플릿에 포함된 일부 인자는 우리include에서 동적으로 지정하면 top입니다.html은 미세한 차이로 인해 여러 개의 코드를 작성하지 않을 것이다.
정적 파일 구성
우리가 직접 가져온 일부 페이지와 관련된 가방을 정적 파일이라고 한다
  • app 디렉터리에 static 디렉터리를 먼저 만들기;
  • static 디렉터리에 우리의 JS, CSS, Jquery와Bootstrap 등을 가져옵니다.
  • 프로젝트 settings.py에 설정 추가하기;
  • STATIC_URL = '/static/'   #               ,                     
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR,"static")  #E:\day68\static   static  
    ]
  • 웹 페이지 관련 이미지, CSS, JS, Jquery 등 가져오기
  •  
    
    

    전재 대상:https://www.cnblogs.com/love9527/p/9082725.html

    좋은 웹페이지 즐겨찾기