Django 치트시트 - 보기

13263 단어
View는 요청을 수락하고 일종의 응답을 반환하는 것입니다.
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)
    

    좋은 웹페이지 즐겨찾기