Maison  >  Article  >  développement back-end  >  Dossier d'apprentissage avancé Django

Dossier d'apprentissage avancé Django

高洛峰
高洛峰original
2017-03-20 09:34:291199parcourir

Avant-propos : Ce blog est un complément au blog précédent djangoAvancé.

1. Rendu

Dossier dapprentissage avancé Django

L'interface frontale est relativement simple (laid) et en comporte deux fonctions :

  • Récupérer le titre du livre dans la base de données ex : Nouveau livre A

  • Entrer le titre du livre dans le formulaire, sélectionner l'éditeur, et sélectionnez l'auteur (choix multiple), après la saisie, cliquez pour créer un nouveau livre, soumettre, et les données seront créées dans la base de données

2. Implémentation

Implémentons d'abord la première fonction, en imprimant le titre du livre sur la page en fonction des données de la base de données.

1. Ajouter une urlroutage

    url(r'^book/', views.book),

2.

Django utilise la méthode GET par défaut, c'est-à-dire pour obtenir des données ; si vous souhaitez créer/modifier des données, comme la deuxième fonction qui sera implémentée plus tard, vous devez utiliser la méthode 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. Créez book.html sous templates/app01 :

books est A. collection de objets pour tous les livres de la base de données. Utilisez une boucle en HTML pour afficher les titres des livres sur la page d'accueil.

<h2>书列表:</h2>
    <ul>
        {% for book in books %}
            <li>{{ book.name }}</li>
        {% endfor %}
    </ul>

Ensuite, implémentez la deuxième fonction et créez des données.

Regardons d'abord le HTML front-end :

<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>

Remarque :

  • Parce que nous créons des données, la méthode de soumission doit être post.

    action="/payment/book/" est une URL, ce qui signifie soumettre les données à la méthode book, et les données sont encapsulées dans le fichier. paramètre de requête.

  • Lorsque vous sélectionnez un éditeur, devez-vous transmettre le nom de l'éditeur au backend ?? En fait, ce n'est pas du tout nécessaire, il vous suffit de transmettre l'identifiant sélectionné au backend. Par conséquent, j'ai ajouté la valeur

    attribut à la balise option pour obtenir l'identifiant de l'éditeur. Lorsque vous cliquez sur Soumettre pour soumettre les données, l'identifiant dans la valeur sera soumis à l'attribut nom de. la balise select, name L'attribut soumet ensuite les données en arrière-plan.

  • Vous constaterez que la première ligne du code html a

    {% csrf_token %}, je ne sais pas encore ce que cela signifie ~_ ~, je Si vous supprimez ce code, les données ne seront pas soumises !!

Regardons la méthode du livre de fond

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})

Lorsque je saisis le titre du livre dans l'interface frontale : Nouveau livre A, sélectionnez le deuxième éditeur, sélectionnez les 2ème et 3ème auteurs, pour faciliter la visualisation, je l'imprime dans le fond :

<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

D'après le résultat de l'impression, je sais que author_ids est une liste Lorsque j'ajoute un auteur à un livre, j'utilise le code suivant : .

new_book.authors.add(*author_ids)

Pourquoi devrais-je l'ajouter avant la liste* ? Ne pas ajouter * exposera une erreur ! Ajouter * consiste à convertir le formulaire de liste ["2", "3"] en formulaire d'identification d'auteur 2,3.

Connectez-vous à l'arrière-plan administrateur pour voir le nouveau livre A qui vient d'être créé :

Dossier dapprentissage avancé Django

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn