[PYTHON] Créer et lister des modèles Django

Si vous créez une table par lots et souhaitez créer un modèle dynamiquement

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

Exemple d'utilisation

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

Une fois exécuté, une liste de pagination commune sera affichée.

Recommended Posts

Créer et lister des modèles Django
Créer une liste Django Todo
Création de liste de tâches [Python Django]
Modèle dans Django
liste et somme
list et numpy
Créez ssh-config et créez la commande d'acquisition de liste d'hôtes ssh-config
Créer les paramètres initiaux et les applications de personnel dans Django
Créer un planning Django
Créez dynamiquement des tables dans un schéma avec Django, générez dynamiquement des modèles
Créer une API avec Django
Les débutants de Django créent des applications simples 3
Les débutants de Django créent des applications simples 1
[Python] Créer une liste de dates et d'heures pour une période spécifiée
Créer une page d'accueil avec django
Installez Python 3.7 et Django 3.0 (CentOS)
Les débutants de Django créent des applications simples 2
Vérification de l'installation et du fonctionnement de Django
Créez votre propre middleware Django
Créer une fonction d'authentification à l'aide de django-allauth et CustomUser dans Django
Liste Python et tapples et virgules
Notation et générateur d'inclusion de liste Python
Vérification d'entrée Django et entrée de type de calendrier
[Django] Organiser les commandes et les rôles
Les débutants de Django créent des applications simples 5
Créons une IA à trois voies avec Pylearn2 --Save and load model -
Créez un fichier temporaire avec django sous forme de zip et renvoyez-le
Création et déploiement d'applications Django (PTVS) à l'aide du stockage Azure Table
Créez des commandes Django personnalisées et exécutez-les à partir de la ligne de commande
Creusez le répertoire et créez une liste de chemins de répertoire + noms de fichiers
[Note] Création et terminologie du projet Django
Différence entre list () et [] en Python
Étapes pour créer un projet Django
HTTPS avec Django et Let's Encrypt
Créer une nouvelle application utiliser python, django
Créer un téléchargeur de fichiers avec Django
Créer et lire des paquets de messages en Python
Créer un bot LINE avec Django
Défi pour créer un rapport de liste de l'axe des temps avec l'API Toggl et Python
Depuis que j'ai commencé à apprendre Python et Django, je vais lister les pages qui ont été utiles
Déployez Django + React à partir de zéro vers GKE (4) Créez un cluster et un conteneur PUSH
Créer une application Todo avec Django ④ Implémenter la fonction de création de dossier et de tâche