前書き: このブログは、以前のブログ djangoAdvanced の補足です。
フロントエンドインターフェイスは比較的単純 (醜い) で、次の 2 つの機能があります:
データベースから本のタイトルを取得します。例: New book A
フォームに本のタイトルを入力、出版社を選択、著者を選択(複数選択)、入力完了後、クリックして新規書籍を作成して送信すると、データベースにデータが作成されます
最初の関数を最初に実装しましょう。データベースのデータに基づいて書籍のタイトルをページ上に出力します。
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つ目の関数を実装してデータを作成します。
<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})
<QueryDict: {'name': ['新书A'], 'csrfmiddlewaretoken': ['V9OdHSJ10OFSq3r vI41tggns1W2VxwV'], 'publisher_id': ['2'], 'author_ids': ['2', '3']}> ------->>: 新书A 2 ['2', '3'] ---->: <WSGIRequest: POST '/payment/book/'> [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 サイトの他の関連記事を参照してください。