[PYTHON] Erstellen und listen Sie Django-Modelle auf

Wenn Sie eine Tabelle im Stapel erstellen und ein Modell dynamisch erstellen möchten

def create_model_class(name: str, app_label: str = "", module: str = "", options=None, fields=None):
    class Meta(object):
        pass
    if app_label:
        setattr(Meta, "app_label", app_label)
    if options is not None:
        for key, value in options.items():
            setattr(Meta, key, value)
    attrs = {"__module__": module, "Meta": Meta}
    if fields:
        attrs.update(fields)
    model = type(name, (models.Model,), attrs)
    return model

cf. https://code.djangoproject.com/wiki/DynamicModels

Anwendungsbeispiel

views.py


def index(request):
    app_label = "hello"
    model_name = "ItemModel"
    ops = {"db_table": "items"}
    fields = {}
    fields["id"] = models.AutoField(primary_key=True, null=False)
    fields["name"] = models.TextField(blank=True, null=True)
    modelObj = create_model_class(
        name=model_name,
        app_label=app_label,
        module=".".join([app_label, model_name]),
        options=ops,
        fields=fields
    )

    post_list = modelObj.objects.all()
    page_obj = paginate_queryset(request, post_list, 50)
    context = {
        'list': page_obj.object_list,
        'page_obj': page_obj,
    }
    return render(request, 'hello/index.html', context)

def paginate_queryset(request, queryset, count):
    paginator = Paginator(queryset, count)
    page = request.GET.get('page')
    try:
        page_obj = paginator.page(page)
    except PageNotAnInteger:
        page_obj = paginator.page(1)
    except EmptyPage:
        page_obj = paginator.page(paginator.num_pages)
    return page_obj

hello/index.html


{% extends 'base.html' %}
{% block content %}
  <div class="container">
      <h3 class="text-center my-5">List of Stocks </h3>
        <table class="table table-striped table-bordered">
            <thead class="thead-inverse">
                <tr>
                    <th>Id</th>
                    <th>Name</th>
                </tr>
            </thead>
            <tbody>
              {% for item in list %}
                  <tr>
                      <td>{{item.id}}</td>
                      <td>{{item.name}}</td>
                  <tr>
              {% endfor %}
            </tbody>
        </table>
      <div>
        <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">&lt;</span>
              </a>
            </li>
            {% endif %}

            {% if page_obj.number > 3 %}
            <li class="page-item">
              <a class="page-link" href="?page=1" aria-label="First">1</a>
            </li>
            {% endif %}

            {% if page_obj.number > 4 %}
            <li class="page-item"><span class="page-link" aria-hidden="true">...</span></li>
            {% endif %}

            {% for link_page in page_obj.paginator.page_range %}
            {% if link_page == page_obj.number %}
            <li class="page-item active">
              <a class="page-link" href="?page={{ link_page }}">
                {{ link_page }}
              </a>
            </li>
            {% elif link_page < page_obj.number|add:10 and link_page > page_obj.number|add:-3 %}
            <li class="page-item">
              <a class="page-link" href="?page={{ link_page }}">
                {{ link_page }}
              </a>
            </li>
            {% endif %}
            {% endfor %}

            {% if page_obj.number < page_obj.paginator.num_pages|add:-3 %}
            <li class="page-item"><span class="page-link" aria-hidden="true">...</span></li>
            {% endif %}

            {% if page_obj.number < page_obj.paginator.num_pages|add:-2 %}
            <li class="page-item">
              <a class="page-link" href="?page={{ page_obj.paginator.num_pages }}" aria-label="Last">{{ page_obj.paginator.num_pages}}</a>
            </li>
            {% endif%}

            {% 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">&gt;</span>
              </a>
            </li>
            {% endif %}
          </ul>
        </nav>
      </div>
  </div>
{% endblock %}

Bei der Ausführung wird eine Liste der häufigsten Paging-Vorgänge angezeigt.

Recommended Posts

Erstellen und listen Sie Django-Modelle auf
Django Todo Listenerstellung
ToDo-Listenerstellung [Python Django]
Modell in Django
Liste und Summe
Liste und Numpy
Erstellen Sie den Befehl ssh-config und den Erfassungsbefehl ssh-config host list
Erstellen Sie erste Einstellungen und Mitarbeiter-Apps in Django
Erstellen Sie einen Django-Zeitplan
Erstellen Sie mit Django dynamisch Tabellen im Schema und generieren Sie dynamisch Modelle
Erstellen Sie eine API mit Django
Django-Anfänger erstellen einfache Apps 3
Django-Anfänger erstellen einfache Apps 1
[Python] Erstellen Sie eine Datums- und Zeitliste für einen bestimmten Zeitraum
Erstellen Sie eine Homepage mit Django
Installieren Sie Python 3.7 und Django 3.0 (CentOS)
Django-Anfänger erstellen einfache Apps 2
Django Installation und Funktionsprüfung
Erstellen Sie Ihre eigene Django-Middleware
Erstellen Sie eine Authentifizierungsfunktion mit django-allauth und CustomUser in Django
Python-Liste und Tapples und Kommas
Python-Listeneinschlussnotation und Generator
Django-Eingabeprüfung und Kalendertyp-Eingabe
[Django] Organisiere Befehle und Rollen
Django-Anfänger erstellen einfache Apps 5
Lassen Sie uns mit Pylearn2 eine Drei-Wege-KI erstellen - Modell speichern und laden -
Erstellen Sie eine temporäre Datei mit Django als Zip und geben Sie sie zurück
Erstellen und Bereitstellen von Django-Apps (PTVS) mithilfe des Azure Table-Speichers
Erstellen Sie benutzerdefinierte Django-Befehle und führen Sie sie über die Befehlszeile aus
Durchsuchen Sie das Verzeichnis und erstellen Sie eine Liste mit Verzeichnispfaden und Dateinamen
[Anmerkung] Django-Projekterstellung und Terminologie
Unterschied zwischen list () und [] in Python
Schritte zum Erstellen eines Django-Projekts
HTTPS mit Django und Let's Encrypt
Erstellen Sie eine neue Anwendung mit Python, Django
Erstellen Sie mit Django einen Datei-Uploader
Erstellen und lesen Sie Messagepacks in Python
Erstellen Sie mit Django einen LINE-Bot
Herausforderung beim Erstellen eines Zeitachsenlistenberichts mit der Toggl-API und Python
Seit ich Python und Django lerne, werde ich Seiten auflisten, die hilfreich waren
Stellen Sie Django + React von Grund auf auf GKE bereit. (4) Erstellen Sie Cluster- und Container-PUSH
Todo-App mit Django erstellen ④ Ordner- und Aufgabenerstellungsfunktion implementieren