Django の高度な学習記録

高洛峰
リリース: 2017-03-20 09:34:29
オリジナル
1210 人が閲覧しました

前書き: このブログは、以前のブログ djangoAdvanced の補足です。

1. レンダリング

Django の高度な学習記録

フロントエンドインターフェイスは比較的単純 (醜い) で、次の 2 つの機能があります:

  • データベースから本のタイトルを取得します。例: New book A

  • フォームに本のタイトルを入力、出版社を選択、著者を選択(複数選択)、入力完了後、クリックして新規書籍を作成して送信すると、データベースにデータが作成されます

2. 実装

最初の関数を最初に実装しましょう。データベースのデータに基づいて書籍のタイトルをページ上に出力します。

1. urlroute

    url(r'^book/', views.book),
ログイン後にコピー

を追加します。2. views.pyにbookメソッドを定義します。これは、データを作成する場合に使用されます。たとえば、後でデータを変更する 2 番目の関数を実装するには、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. templates/app01 の下に book.html を作成します:

books は、データベース内のすべての書籍の オブジェクト

のコレクションです。フロントエンドページ名。

<h2>书列表:</h2>
    <ul>
        {% for book in books %}
            <li>{{ book.name }}</li>
        {% endfor %}
    </ul>
ログイン後にコピー
次に、2つ目の関数を実装してデータを作成します。

まずフロントエンド 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="/payment/book/" はURL。これはデータを book メソッドに送信することを意味し、データはリクエスト パラメータにカプセル化されます。

  • 出版社を選択するとき、出版社の名前をバックエンドに送信する必要がありますか?そこで、発行者のIDを取得するためのvalue属性をoptionタグに追加してsubmitをクリックしてデータを送信すると、value内のIDがselectタグのname属性に送信されるようにしました。属性はデータを Backstage に送信します。

  • 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})
    ログイン後にコピー

  • フロントエンドインターフェイスに本のタイトルを入力するとき: New Book A、2番目の出版社を選択し、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 の高度な学習記録の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート