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
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)
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">«</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">«</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">»</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">»</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">×</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.)
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', )
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))
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.)
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)
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
]
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>
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