Django 고급 학습 기록

高洛峰
풀어 주다: 2017-03-20 09:34:29
원래의
1196명이 탐색했습니다.

서문: 이 블로그는 이전 블로그 djangoAdvanced에 대한 보충 글입니다.

1. 렌더링

Django 고급 학습 기록

프론트엔드 인터페이스는 상대적으로 단순하고(못생겼음) 두 가지가 있습니다. 기능:

  • 데이터베이스에서 책 제목 검색 예: 새 책 A

  • 양식에 책 제목을 입력하고 선택 출판사, 저자 선택(객관식) 입력 후 새 도서 생성을 클릭하여 제출하면 데이터베이스에 데이터가 생성됩니다.

2. 구현

먼저 데이터베이스 데이터를 기반으로 페이지에 책 제목을 인쇄하는 첫 번째 기능을 구현해 보겠습니다.

1. URL 추가route

    url(r'^book/', views.book),
로그인 후 복사

2. views.py에서 책 메소드 정의

Django는 데이터를 얻기 위해 기본적으로 GET 메소드를 사용하는데, 나중에 구현할 두 번째 함수처럼 데이터를 생성/수정하려면 POST 메소드를 사용해야 합니다.

def book(request):
    books = models.Book.objects.all()  #找到所有的书
    publisher_list = models.Publisher.objects.all()
    author_list = models.Author.objects.all()
 
    print("---->:", request)
    return render(request, "app01/book.html", {"books":books,
                                                     "publishers":publisher_list,
                                                     "authors":author_list})
로그인 후 복사


3. template/app01 아래에 book.html을 만듭니다.

책이 데이터베이스에 있습니다. 프런트엔드 페이지에 책 제목을 표시하기 위해 html에서 루프 를 사용하는 모든 책에 대한 개체 모음입니다.

<h2>书列表:</h2>
    <ul>
        {% for book in books %}
            <li>{{ book.name }}</li>
        {% endfor %}
    </ul>
로그인 후 복사

다음으로 두 번째 함수를 구현하고 데이터를 생성합니다.

먼저 프론트엔드 HTML을 살펴보겠습니다:

<form method="post" action="/payment/book/"> {% csrf_token %}
        book name:<input type="text" name="name"/>
        <select name="publisher_id">
            {% for publisher in publishers %}
                <option value="{{ publisher.id }}">{{ publisher.name }}</option>
            {% endfor %}
        </select>
        <select name="author_ids" multiple="multiple">
            {% for author in authors %}
                <option value="{{ author.id }}">{{ author.first_name }}</option>
            {% endfor %}
        </select>
        <div>
            <input type="submit" value="创建新书"/>
        </div>
    </form>
로그인 후 복사

참고:

  • 데이터를 생성하기 위한 것이므로 제출 방법은 반드시 post여야 합니다. action="/pay/book/"은 URL로 book 방식으로 데이터를 제출한다는 의미이며, 해당 데이터는 에 캡슐화되어 있습니다. 요청 매개변수.

  • 퍼블리셔를 선택할 때 퍼블리셔 이름을 백엔드에 전달해야 하나요?? 사실 전혀 필요하지 않고 그냥 하면 됩니다. 선택한 ID를 백엔드에 전달합니다. 따라서 게시자의 ID를 얻기 위해 옵션 태그에 속성 값을 추가했습니다. 제출을 클릭하여 데이터를 제출하면 값의 ID가 name 속성에 제출됩니다. 그런 다음 선택 태그, 이름 속성이 데이터를 배경으로 제출합니다.

  • html 코드의 첫 번째 줄에 {% csrf_token %}이 있는 것을 볼 수 있는데, 이것이 무엇을 의미하는지 아직 모르겠습니다~_ ~, 저는 이 코드를 삭제하면 데이터가 제출되지 않습니다!!

백그라운드북 방법을 살펴보겠습니다

def book(request):
    if request.method == "POST":  #若是创建书的数据
        print(request.POST)
        book_name = request.POST.get("name")
        publisher_id = request.POST.get("publisher_id")
        # 即使在前端页面选择多个作者只会返回一个值,只能取到最后一个作者的id
        #author_ids = request.POST.get("author_ids")
        author_ids = request.POST.getlist("author_ids") #getlist 可取出所有作者的id

        #生成一个书的对象
        new_book = models.Book(
            name = book_name,
            publisher_id = publisher_id,
            publish_date = "2017-3-18"
        )
        new_book.save()  #同步到数据库

        #new_book.authors.add(1,2) 添加作者
        new_book.authors.add(*author_ids) #author_ids为列表,需在前面加上*转化为id

        print("------->>:", book_name,publisher_id,author_ids)

    books = models.Book.objects.all()
    publisher_list = models.Publisher.objects.all()
    author_list = models.Author.objects.all()

    print("---->:", request)
    return render(request, "app01/book.html", {"books":books,
                                                     "publishers":publisher_list,
                                                     "authors":author_list})
로그인 후 복사

프론트엔드 인터페이스에서 책 제목을 입력할 때: 신간 A, 두 번째 출판사 선택, 2, 3저자를 선택하고, 보기 편의상 백그라운드에서 인쇄합니다. :

<QueryDict: {&#39;name&#39;: [&#39;新书A&#39;], &#39;csrfmiddlewaretoken&#39;: [&#39;V9OdHSJ10OFSq3r
vI41tggns1W2VxwV&#39;], &#39;publisher_id&#39;: [&#39;2&#39;], &#39;author_ids&#39;: [&#39;2&#39;, &#39;3&#39;]}>
------->>: 新书A 2 [&#39;2&#39;, &#39;3&#39;]
---->: <WSGIRequest: POST &#39;/payment/book/&#39;>
[18/Mar/2017 14:06:23] "POST /payment/book/ HTTP/1.1" 200 1335
로그인 후 복사

인쇄 결과에 따르면 Author_ids가 목록이라는 것을 알 수 있습니다. 책에 저자를 추가할 때 다음 코드를 사용합니다.

new_book.authors.add(*author_ids)
로그인 후 복사

왜 목록 앞에 *를 추가해야 하나요? *를 추가하지 않으면 오류가 발생합니다! *를 추가하는 것은 목록 형식 ["2", "3"]을 작성자 ID 형식 2,3으로 변환하는 것입니다.

A가 방금 만든 새 책을 보려면 관리자 배경에 로그인하세요.

Django 고급 학습 기록

위 내용은 Django 고급 학습 기록의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿