Erste Schritte mit Python Django (5)

Kindermodell CRUD

Wie man ein Kind liest

Lassen Sie uns eine Liste der Eindrücke des Kindes für das Buch der Eltern anzeigen.

In cms / models.py definierte der Eindruck das Buch als externen Schlüssel.

class Impression(models.Model):
    """Impressionen"""
    book = models.ForeignKey(Book, verbose_name='Bücher', related_name='impressions', on_delete=models.CASCADE)
    comment = models.TextField('Kommentar', blank=True)

Daher können die mit dem Buch verbundenen Eindrücke des Kindes unter Verwendung von related_name wie folgt ausgelesen werden. Auch hier schreibe ich kein SQL.

impressions = book.impressions.all().order_by('id')   #Lesen Sie die Eindrücke von Kindern von Büchern

Ansicht der Kinderliste

Dieses Mal werde ich mit ListView von "General View" schreiben. Mit diesem können Sie leicht Paging und so weiter erreichen.

Fügen Sie die folgende Beschreibung zu cms / views.py hinzu.

from django.views.generic.list import ListView
  :

class ImpressionList(ListView):
    """Liste der Eindrücke"""
    context_object_name='impressions'
    template_name='cms/impression_list.html'
    paginate_by = 2  #Seite bis zu 2 Seiten pro Seite

    def get(self, request, *args, **kwargs):
        book = get_object_or_404(Book, pk=kwargs['book_id'])  #Lesen Sie die Bücher der Eltern
        impressions = book.impressions.all().order_by('id')   #Lesen Sie die Eindrücke von Kindern von Büchern
        self.object_list = impressions
        
        context = self.get_context_data(object_list=self.object_list, book=book)    
        return self.render_to_response(context)

Untergeordnete Listenvorlage

Anwenden von BootStrap,

Ich mache das Es ist ein bisschen lang.

Erstellen Sie "mybook / cms / templates / cms / impression_list.html", indem Sie "mybook / cms / templates / cms / base_html" erben.

{% extends "cms/base.html" %}

{% block title %}Liste der Eindrücke{% endblock title %}

{% block content %}
    <h4 class="mt-4 border-bottom">Liste der Eindrücke<small class="text-muted ml-3">{{ book.name }}</small></h4>
    <a href="{% url 'cms:impression_add' book_id=book.id %}" class="btn btn-primary btn-sm my-3">hinzufügen</a>
    <table class="table table-striped table-bordered">
      <thead>
        <tr>
          <th>ID</th>
          <th>Kommentar</th>
          <th>Operation</th>
        </tr>
      </thead>
      <tbody>
        {% for impression in impressions %}
        <tr>
          <td>{{ impression.id }}</td>
          <td>{{ impression.comment|linebreaksbr }}</td>
          <td>
            <a href="{% url 'cms:impression_mod' book_id=book.id impression_id=impression.id %}" class="btn btn-outline-primary btn-sm">Fix</a>
            <button class="btn btn-outline-danger btn-sm del_confirm" data-toggle="modal" data-target="#deleteModal" data-pk="{{ impression.id }}" data-url="{% url 'cms:impression_del' book_id=book.id impression_id=impression.id %}">Löschen</button>
          </td>
        </tr>
        {% endfor %}
      </tbody>
    </table>

    {% if is_paginated %}
    <nav aria-label="Page navigation">
      <ul class="pagination">
        {% if page_obj.has_previous %}
          <li class="page-item"><a class="page-link" href="?page={{ page_obj.previous_page_number }}" aria-label="Previous"><span aria-hidden="true">&laquo;</span><span class="sr-only">Previous</span></a></li>
        {% else %}
          <li class="page-item disabled"><a class="page-link" href="#" aria-label="Previous"><span aria-hidden="true">&laquo;</span><span class="sr-only">Previous</span></a></li>
        {% endif %}
        {% for linkpage in page_obj.paginator.page_range %}
          {% ifequal linkpage page_obj.number %}
            <li class="page-item active"><a class="page-link" href="#">{{ linkpage }}</a></li>
          {% else %}
            <li class="page-item"><a class="page-link" href="?page={{ linkpage }}">{{ linkpage }}</a></li>
        {% endifequal %}
        {% endfor %}
        {% if page_obj.has_next %}
          <li class="page-item"><a class="page-link" href="?page={{ page_obj.next_page_number }}" aria-label="Next"><span aria-hidden="true">&raquo;</span><span class="sr-only">Next</span></a></li>
        {% else %}
          <li class="page-item disabled"><a class="page-link" href="#" aria-label="Next"><span aria-hidden="true">&raquo;</span><span class="sr-only">Next</span></a></li>
        {% endif %}
      </ul>
    </nav>
    {% endif %}

    <a href="{% url 'cms:book_list' %}" class="btn btn-secondary btn-sm">Rückkehr</a>

    {#Modaler Dialog zur Bestätigung des Löschvorgangs#}
    <div class="modal fade" id="deleteModal" tabindex="-1" role="dialog" aria-labelledby="deleteModalLabel" aria-hidden="true">
      <div class="modal-dialog" role="document">
        <div class="modal-content">
          <div class="modal-header">
            <h5 class="modal-title" id="deleteModalLabel">Bestätigung</h5>
            <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
          </div>
          <div class="modal-body">
            <p>ID: <span id="del_pk"></span>Möchten Sie löschen?</p>
          </div>
          <div class="modal-footer">
            <a href="#" class="btn btn-primary" id="del_url">OK</a>
            <button type="button" class="btn btn-secondary" data-dismiss="modal">Cancel</button>
          </div>
        </div>
      </div>
    </div>
{% endblock content %}

{% block extra_js %}
<script>
$(function() {
  $('.del_confirm').on('click', function () {
     $("#del_pk").text($(this).data("pk"));
     $('#del_url').attr('href', $(this).data("url"));
  });
});
</script>
{% endblock %}

Die ausgefüllte Listenseite sieht wie folgt aus. (Trotzdem wird es nicht funktionieren, es sei denn, Sie tun die Zukunft, also denken Sie bitte an ein solches Bild.)

django10.jpg

Untergeordnetes Formular hinzufügen / ändern

Fügen Sie Folgendes zu cms / forms.py hinzu. Hier erstellen wir ein Basisformular zum Hinzufügen und Ändern von Impression-Modellen in cms / models.py.

  :
from cms.models import Book, Impression
  :

class ImpressionForm(ModelForm):
    """Abdruckform"""
    class Meta:
        model = Impression
        fields = ('comment', )

Ansicht zum Hinzufügen und Ändern von Kindern

Fügen Sie Folgendes zu cms / views.py hinzu.

  :
from cms.models import Book, Impression
from cms.forms import BookForm, ImpressionForm
  :

def impression_edit(request, book_id, impression_id=None):
    """Impressionen bearbeiten"""
    book = get_object_or_404(Book, pk=book_id)  #Lesen Sie die Bücher der Eltern
    if impression_id:   # impression_ID wird angegeben(Zum Zeitpunkt der Korrektur)
        impression = get_object_or_404(Impression, pk=impression_id)
    else:               # impression_ID nicht angegeben(Zum Zeitpunkt der Hinzufügung)
        impression = Impression()

    if request.method == 'POST':
        form = ImpressionForm(request.POST, instance=impression)  #Erstellen Sie ein Formular aus POST-Anforderungsdaten
        if form.is_valid():    #Formularvalidierung
            impression = form.save(commit=False)
            impression.book = book  #Stellen Sie das Elternbuch dieses Eindrucks ein
            impression.save()
            return redirect('cms:impression_list', book_id=book_id)
    else:    #Zum Zeitpunkt von GET
        form = ImpressionForm(instance=impression)  #Erstellen Sie ein Formular aus einer Impression-Instanz
        
    return render(request,
                  'cms/impression_edit.html',
                  dict(form=form, book_id=book_id, impression_id=impression_id))

Untergeordnete Vorlage hinzufügen / ändern

Erstellen Sie "mybook / cms / templates / cms / impression_edit.html", indem Sie "mybook / templates / base_html" erben.

{% extends "cms/base.html" %}
{% load bootstrap4 %}

{% block title %}Impressionen bearbeiten{% endblock title %}

{% block content %}
    <h4 class="mt-4 mb-5 border-bottom">Impressionen bearbeiten</h4>
    {% if impression_id %}
    <form action="{% url 'cms:impression_mod' book_id=book_id impression_id=impression_id %}" method="post">
    {% else %}
    <form action="{% url 'cms:impression_add' book_id=book_id %}" method="post">
    {% endif %}
      {% csrf_token %}
      {% bootstrap_form form layout='horizontal' %}
      <div class="form-group row">
        <div class="offset-md-3 col-md-9">
          <button type="submit" class="btn btn-primary">Senden</button>
        </div>
      </div>
    </form>
    <a href="{% url 'cms:impression_list' book_id=book_id %}" class="btn btn-secondary btn-sm">Rückkehr</a>
{% endblock content %}

Die Seite zum Hinzufügen und Ändern lautet wie folgt. (Trotzdem wird es nicht funktionieren, es sei denn, Sie tun die Zukunft, also denken Sie bitte an ein solches Bild.)

django11.jpg

Ansicht der Kinderlöschung

Fügen Sie Folgendes zu cms / views.py hinzu.

Dieses Mal habe ich, anstatt es plötzlich zu löschen, einen modalen Dialog von Bootstrap eingerichtet und eine Bestätigungsnachricht ausgegeben. Der Inhalt der Ansicht entspricht jedoch dem des Elternbuchs.

def impression_del(request, book_id, impression_id):
    """Impressionen löschen"""
    impression = get_object_or_404(Impression, pk=impression_id)
    impression.delete()
    return redirect('cms:impression_list', book_id=book_id)

django12.jpg

Untergeordnetes URL-Schema

Fügen Sie Folgendes zu cms / urls.py hinzu.

urlpatterns = [
    :

    #Impressionen
    path('impression/<int:book_id>/', views.ImpressionList.as_view(), name='impression_list'),  #Aufführen
    path('impression/add/<int:book_id>/', views.impression_edit, name='impression_add'),        #Anmeldung
    path('impression/mod/<int:book_id>/<int:impression_id>/', views.impression_edit, name='impression_mod'),  #Fix
    path('impression/del/<int:book_id>/<int:impression_id>/', views.impression_del, name='impression_del'),   #Löschen
]

Übergeordnete Liste ändern

Fügen Sie einen Link hinzu, damit Sie eine "Impression-Liste" des entsprechenden Buches aus der Liste der übergeordneten Bücher erhalten.

Fügen Sie eine Zeile zu "mybook / cms / templates / cms / book_list.html" hinzu.

          <td>
            <a href="{% url 'cms:book_mod' book_id=book.id %}" class="btn btn-outline-primary btn-sm">Fix</a>
            <a href="{% url 'cms:book_del' book_id=book.id %}" class="btn btn-outline-danger btn-sm">Löschen</a>
            <a href="{% url 'cms:impression_list' book_id=book.id %}" class="btn btn-outline-info btn-sm">Liste der Eindrücke</a>
          </td>

django13.jpg

Starten Sie nun den lokalen Server, folgen Sie der "Liste der Impressionen" aus der "Liste der Bücher" und registrieren / ändern / löschen Sie die Impressionen.

http://127.0.0.1:8000/cms/book/

Wenn Sie eine CRUD für ein Modell erstellen können, das eine Eltern-Kind-Beziehung hat, wie bisher erläutert, ist der Rest das Entwerfen des Modells. Ich denke, Sie können es anwenden, um verschiedene Dinge zu erstellen.

Fahren Sie mit [Einführung in Python Django (6)] fort (http://qiita.com/kaki_k/items/b76acaeab8a9d935c35c).

Recommended Posts

Erste Schritte mit Python Django (1)
Erste Schritte mit Python Django (3)
Einführung in Python Django (6)
Erste Schritte mit Python Django (5)
Django 1.11 wurde mit Python3.6 gestartet
1.1 Erste Schritte mit Python
Erste Schritte mit Python
Erste Schritte mit Django 1
Erste Schritte mit Python
Erste Schritte mit Django 2
Einführung in Python-Funktionen
Erste Schritte mit Django mit PyCharm
Erste Schritte mit Python Responder v2
Erste Schritte mit Python-Webanwendungen
Erste Schritte mit Python für PHPer-Klassen
Erste Schritte mit Python Grundlagen von Python
Erste Schritte mit genetischen Python-Algorithmen
Erste Schritte mit Python 3.8 unter Windows
Erste Schritte mit Python für PHPer-Funktionen
Erste Schritte mit Python3 # 1 Grundkenntnisse erlernen
Erste Schritte mit Android!
Erste Schritte mit Python Web Scraping Practice
Erste Schritte mit apache2
Einführung in die Optimierung
Erste Schritte mit Python für PHPer-Super Basics
Erste Schritte mit Python Web Scraping Practice
Erste Schritte mit Dynamo von Python Boto
Erste Schritte mit Spark
Erste Schritte mit Pydantic
Erste Schritte mit Jython
Erste Schritte mit Heroku-Viewing Hello World in Python Django mit Raspberry PI 3
Erste Schritte mit Python mit 100 Klopfen bei der Sprachverarbeitung
[Übersetzung] Erste Schritte mit Rust für Python-Programmierer
Django Erste Schritte Teil 2 mit dem Eclipse Plugin (PyDev)
Erste Schritte mit AWS IoT in Python
Erste Schritte mit Django Teil 3 über Python3 und MySQL Connector
Materialien zum Lesen, wenn Sie mit Python beginnen
Einstellungen für den Einstieg in MongoDB mit Python
Übersetzen Erste Schritte mit TensorFlow
Mach Django mit CodeStar (Python3.6.8, Django2.2.9)
Einführung in Tkinter 2: Button
Fangen Sie mit Django an! ~ Tutorial ⑤ ~
Erste Schritte mit PKI mit Golang ―― 4
Django Erste Schritte: 2_ Erstellen eines Projekts
Django Erste Schritte: 1_Umgebungsgebäude
Mach Django mit CodeStar (Python3.8, Django2.1.15)
Python3 + Django ~ Mac ~ mit Apache
Erste Schritte mit Django: 4_MySQL-Integration
Fangen Sie mit Django an! ~ Tutorial ④ ~
Fangen Sie mit Django an! ~ Tutorial ⑥ ~
Beginnen Sie mit Python! ~ ② Grammatik ~
Erste Schritte mit Python3 # 2 Erfahren Sie mehr über Typen und Variablen
Erste Schritte mit Google App Engine für Python und PHP
Python gestartet
Beginnen Sie mit Python! ~ ① Umweltbau ~
Link, um mit Python zu beginnen