Django 치트시트 - 보기
render()
함수에서 템플릿에 전달할 수 있는 변수인 context
를 전달할 수 있습니다.새 보기를 추가하는 방법
your-project/your-app/urls.py
에서 URL을 정의합니다.your-projects/your-app/views/new-view.py
에 보기 추가your-projects/your-app/views/__init__.py
에서 보기 가져오기단축키: 렌더링, 리디렉션
from django.shortcuts import render, redirect
def index(request):
students = Students.objects.all()
context = { "students": students }
return render("index.html", context)
def new(request):
# save a new student
return redirect("your_app:new")
redirect
로 컨텍스트를 전달할 수 없습니다. URL 및 쿼리 매개변수만 전달할 수 있습니다.메시지
https://docs.djangoproject.com/en/4.1/ref/contrib/messages/#using-messages-in-views-and-templates
"메시지"(예: 플래시 메시지, 다른 프레임워크의 토스트 메시지)를 사용하려는 경우 메시지 프레임워크를 사용할 수 있습니다.
이 가져오기를 추가하고
from django.contrib import messages
... 보기에서 이와 같은 메시지를 호출합니다.
messages.debug(request, '%s SQL statements were executed.' % count)
messages.info(request, 'Three credits remain in your account.')
messages.success(request, 'Profile details updated.')
messages.warning(request, 'Your account expires in three days.')
messages.error(request, 'Document deleted.')
템플릿은 다음과 같은 메시지를 표시할 수 있습니다.
{% if messages %}
<ul class="messages">
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
모든 메시지를 반복하는 것이 중요합니다. 그렇지 않으면 메시지가 지워지지 않습니다.
from django.contrib import messages
# view to create new student
def new(request):
if request.method == "POST":
# do something with the form
student.save()
# send messages
messages.success(request, "saved student")
형식 집합
동일한 모델의 여러 레코드(예: 여러 학생)를 처리하려는 경우 형식 집합을 사용할 수 있습니다.
Formset은 모든 레코드에 대한 유효성 검사를 수행하므로 편리합니다.
보기에서 다음과 같이 formset을 정의할 수 있습니다.
# your_project/your_app/views/new.py
from django.forms import modelformset_factory
from django.shortcuts import redirect, render
from your_app.models import Student
def new(request):
# fields: defines which fields to show in the form
# extra: defines how many extra rows you want in the form, on top of existing records
StudentFormset = modelformset_factory(Student, fields=["last_name", "first_name", "photo"], extra=10)
if request.method == "GET":
# by default, formset will populate all records in that model
# specify the set of records to be "no students"
formset = StudentFormset(query=Student.objects.none())
context = { "formset": formset }
return render("your_app/new.html", context)
if request.method == "POST":
# populate the formset with user input
formset = StudentFormset(request.POST, request.FILES)
if formset.is_valid():
# save the entire formset
formset.save()
# make sure to redirect after a POST request
return redirect("your_app:new")
formset에 외래 키를 지정해야 하는 경우 다음과 같이 각 레코드를 반복해야 합니다.
# your_project/your_app/views/new.py
if formset.is_valid():
# get the instances via the save method
# but don't commit yet
instances = formset.save(commit=False)
for student in instances:
student.school_id = 1
# populate school_id and save one by one
student.save()
이 경우 모든 트랜잭션이 성공하거나 트랜잭션이 성공하지 않는 경우 "원자 트랜잭션"이 필요할 수 있습니다.
데코레이터 또는
with:
블록을 사용할 수 있습니다(후자의 옵션에 대해서는 설명서를 참조하십시오. 저는 들여쓰기가 적은 데코레이터를 선호합니다).# define a helper function with a decorator
from django.db import transaction
@transaction.atomic
def save_students_with_school(formset, school_id):
instances = formset.save(commit=False)
for student in instances:
student.school_id = school_id
# populate school_id and save one by one
student.save()
# call them in your view like this
if formset.is_valid():
# call the atomic transaction
save_students_with_school(formset, 1)
Reference
이 문제에 관하여(Django 치트시트 - 보기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/jesuissuyaa_/django-cheatsheet-views-135f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)