5. 보기--Django
30495 단어 Django
(python3.8) [root@node8 polls]# pwd
/blueicex/python-project/mysite/polls
(python3.8) [root@node8 polls]# vim views.py
from django.shortcuts import render
from django.http import HttpResponse
def detail(request, question_id):
return HttpResponse("You're looking at question %s." % question_id)
def results(request, question_id):
response = "You're looking at the results of question %s."
return HttpResponse(response % question_id)
def vote(request, question_id):
return HttpResponse("You're voting on question %s." % question_id)
def index(request):
return HttpResponse("Hello, world. You're at the polls index.")
라우팅 추가
(python3.8) [root@node8 polls]# pwd
/blueicex/python-project/mysite/polls
(python3.8) [root@node8 polls]# vim urls.py
from django.urls import path
from . import views
urlpatterns = [
# ex: /polls/
path('', views.index, name='index'),
# ex: /polls/5/
path('/' , views.detail, name='detail'),
# ex: /polls/5/results/
path('/results/' , views.results, name='results'),
# ex: /polls/5/vote/
path('/vote/' , views.vote, name='vote'),
]
2. 정말 유용한 보기를 쓴다
모든 보기에서 해야 할 일은 두 가지입니다. 요청한 페이지의 내용을 포함하는 Http Response 대상을 되돌려주거나, 예를 들어 Http 404와 같은 이상을 던집니다.보기는 데이터베이스에서 기록을 읽을 수 있고 템플릿 엔진(예를 들어 Django가 자체로 가지고 있거나 다른 제3자의)을 사용하여 PDF 파일을 생성할 수 있으며 XML을 출력하고 ZIP 파일을 만들 수 있다.Django는 HttpResponse로 돌아가거나 예외를 던지기만 하면 됩니다.
(python3.8) [root@node8 polls]# vim views.py
from django.shortcuts import render
from django.http import HttpResponse
def detail(request, question_id):
return HttpResponse("You're looking at question %s." % question_id)
def results(request, question_id):
response = "You're looking at the results of question %s."
return HttpResponse(response % question_id)
def vote(request, question_id):
return HttpResponse("You're voting on question %s." % question_id)
def index(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]
output = ', '.join([q.question_text for q in latest_question_list])
return HttpResponse(output)
페이지의 디자인은 보기 함수의 코드에서 죽는다
3. 템플릿
polls 디렉터리에templates 디렉터리를 만듭니다.Django는templates 디렉토리에서 템플릿 파일을 찾습니다.
프로젝트의 TEMPLATES 구성 항목에서는 Django가 템플릿을 로드하고 렌더링하는 방법에 대해 설명합니다.기본 설정 파일은 DjangoTemplates 백엔드를 설정하고 APPDIRS가 True로 설정되었습니다.이 옵션은 각 INSTALLED 에서 Django Templates를APPS 폴더에서 "templates"하위 디렉토리를 찾습니다.이것이 바로 두 번째 부분에서처럼 DIRS 설정을 수정하지 않았음에도 불구하고 Django가 폴스의 템플릿 위치를 정확하게 찾을 수 있는 이유다.만든templates 디렉터리에 디렉터리polls를 만들고 파일index를 새로 만듭니다.html .왜냐하면 appdirectories 템플릿 마운트는 상술한 방법을 통해 실행되기 때문에 Django는polls/index에 인용할 수 있습니다.html 템플릿입니다.
vim index.html
{% if latest_question_list %}
<ul>
{% for question in latest_question_list %}
<li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>No polls are available.</p>
{% endif %}
polls/views를 업데이트합니다.py의 index 보기는 템플릿vim views를 사용합니다.py
from django.http import HttpResponse
from django.template import loader
from .models import Question
def index(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]
template = loader.get_template('polls/index.html')
context = {
'latest_question_list': latest_question_list,
}
return HttpResponse(template.render(context, request))
polls/index를 로드합니다.html 템플릿 파일을 전달하고 상하문(context)을 전달합니다.컨텍스트는 템플릿 내의 변수를 Python 객체로 매핑하는 사전입니다.
4. 단축 함수render()
vim views.py
from django.shortcuts import render
from .models import Question
def index(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]
context = {'latest_question_list': latest_question_list}
return render(request, 'polls/index.html', context)
loader 및 HttpResponse를 가져올 필요가 없습니다.
5. 404 오류 던지기
vim views.py
from django.http import Http404
from django.shortcuts import render
from .models import Question
# ...
def detail(request, question_id):
try:
question = Question.objects.get(pk=question_id)
except Question.DoesNotExist:
raise Http404("Question does not exist")
return render(request, 'polls/detail.html', {'question': question})
6. 단축 함수 getobject_or_404()
get () 함수로 대상을 가져오려고 시도합니다. 존재하지 않으면 Http404 오류를 던지는 것도 일반적인 절차입니다.Django에서 빠른 함수 get 제공object_or_404()
vim views.py
from django.shortcuts import get_object_or_404, render
from .models import Question
# ...
def detail(request, question_id):
question = get_object_or_404(Question, pk=question_id)
return render(request, 'polls/detail.html', {'question': question})
디자인 철학은 왜 보조 함수 get 를 사용합니까object_or_ObjectDoesNotExist 이상을 스스로 포착하는 것이 아니라 404()는?왜 모델 API는 ObjectDoesNotExist를 직접 던지지 않고 Http404를 던지나요?이렇게 하면 모델 레이어와 뷰 레이어의 결합성이 증가합니다.Django 디자인의 가장 중요한 사상 중 하나는 느슨한 결합에도 get 가 있다는 것을 확보하는 것이다list_or_404 () 함수, 작업 원리와 getobject_or_404 () 와 마찬가지로 get () 함수를 제외하고 Filter () 함수로 바뀌었습니다.목록이 비어 있으면 Http 404 예외가 발생합니다.
7. 템플릿 시스템 사용
vim polls/templates/polls/detail.html
<h1>{{ question.question_text }}</h1>
<ul>
{% for choice in question.choice_set.all %}
<li>{{ choice.choice_text }}</li>
{% endfor %}
</ul>
{% for%} 순환에서 발생하는 함수 호출:question.choice_set.all는 Python 코드question으로 해석됩니다.choice_set.all (), 교체할 수 있는 Choice 대상을 되돌려줍니다. 이 대상은 {% for%} 탭 내부에서 사용할 수 있습니다.
8. 템플릿에서 하드코딩 URL 제거
polls/index.html에서 투표 링크를 작성할 때 링크는 하드코딩입니다
<li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
하드 인코딩과 강한 결합된 링크는 많은 응용을 포함하는 항목에 있어서 수정하기가 매우 어렵다.폴스에 있어요.urls의 url () 함수에서name 인자를 통해 URL의 이름을 정의했습니다. 하드코딩 대신 {% url%} 탭을 사용하십시오
<li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>
폴스에 있어요.urls 모듈의 URL 정의에서 지정한 이름을 가진 항목 찾기
...
# the 'name' value as called by the {% url %} template tag
path('/' , views.detail, name='detail'),
...
투표 상세 보기의 URL을 변경합니다. 예를 들어polls/specifics/12/로 변경하려면 템플릿에서 아무것도 수정하지 않아도 됩니다.polls/urls만 있으면 됩니다.py에서 약간 수정
...
# added the word 'specifics'
path('specifics//' , views.detail, name='detail'),
...
9. URL 이름에 네임스페이스 추가
루트 URLconf에 app 이름공간 추가이름 공간을 설정합니다.
vim polls/urls.py
from django.urls import path
from . import views
app_name = 'polls'
urlpatterns = [
path('', views.index, name='index'),
path('/' , views.detail, name='detail'),
path('/results/' , views.results, name='results'),
path('/vote/' , views.vote, name='vote'),
]
vim polls/templates/polls/index.html
<li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>
네임스페이스가 있는 세부 뷰로 수정
<li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>
————Blueicex 2020/07/20 22:41 [email protected]
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Django 라우팅 계층 URLconf 작용 및 원리 해석URL 구성(URLconf)은 Django가 지원하는 웹 사이트의 디렉토리와 같습니다.그것의 본질은 URL과 이 URL을 호출할 보기 함수 사이의 맵표입니다. 위의 예제에서는 URL의 값을 캡처하고 위치 매개 변수로...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.