Enregistrez plusieurs modèles sous un seul formulaire avec Django

Parce qu'il y a un blanc dans le calendrier de l'Avent ...

Contenu de cet article

Les API liées aux formulaires sont relativement généreuses dans Django, mais lorsque vous essayez de modifier plusieurs modèles sous une forme, cela devient soudainement gênant.

Ainsi, je pourrai faire les choses rapidement en utilisant le module.

C'est comme une continuation de l'article précédent.

Module à installer

django-extra-views

pip install django-extra-views

Comment utiliser

Faites-le parce que les vues supplémentaires de django peuvent être atteintes sans utiliser de classe de formulaire.

CreateView

modèle

models.py


from django.db import models


class Person(models.Model):

    name = models.CharField(max_length=255)
    age = models.IntegerField(default=25) #Je veux revenir à 25


class Car(models.Model):

    owner = models.ForeignKey(Person)
    color = models.CharField(max_length=10)

views.py

views.py


from extra_views import CreateWithInlinesView, InlineFormSet


class CarInlineFormSet(InlineFormSet):
    model = Car
    fields = ("color", )
    can_delete = False  #Pas besoin de supprimer dans la vue de création


class PersonCarCreateFormsetView(CreateWithInlinesView):
    model = Person
    fields = ("name", "age")  # self.champs de modèle
    inlines = [CarInlineFormSet, ]
    template_name = "person_formset.html"
    success_url = "/"

modèle

person_formset.html


{% extends "base.html" %}

{% block content %}

    <form method="post">
        {% csrf_token %}
        <table>
            {{ form.as_table }}
        </table>

                {#Inline est répertorié dans une variable appelée inlines#}
        <p>Car Color</p>
        <table>
            {% for form in inlines %}
                {{ form.as_table }}
            {% endfor %}
        </table>
        <button type="submit">save</button>
    </form>

{% endblock %}

UpdateView

modèle

le même

views.py

views.py


from extra_views import InlineFormSet, UpdateWithInlinesView

class CarInlineFormSetCanDelete(InlineFormSet):
    model = Car
    fields = ("color", )
    can_delete = True

class PersonCarUpdateFormsetView(UpdateWithInlinesView):
    model = Person
    fields = ("name", "age")
    inlines = [CarInlineFormSetCanDelete, ]
    template_name = "person_formset.html"
    success_url = "/"

modèle

le même

Résumé

Très pratique.


Postscript 27/09/2017

Comment afficher autre que as_table

Si vous l'écrivez normalement, vous voudrez écrire celui en ligne comme table.name.

J'étais un peu accro à ça

template.html



{% for inline in inlines %}
  {% for line in inline %}
     {{ line.name }}
  {% endfor %}
{% endfor %}

Vous pouvez faire une double boucle comme celle-ci. Ceci est probablement dû au fait que plusieurs modèles en ligne sont définis dans «en ligne».

Postscript jusqu'à ici


Recommended Posts

Enregistrez plusieurs modèles sous un seul formulaire avec Django
Modèle dans Django
Configurer un module avec plusieurs fichiers dans Django
Créez dynamiquement des tables dans un schéma avec Django, générez dynamiquement des modèles
Utilisez Django pour enregistrer les données de tweet
Comment vérifier le comportement d'ORM avec un fichier avec django
Django a changé pour enregistrer beaucoup de données à la fois
recharger dans le shell django avec ipython
Ajouter dynamiquement des champs de formulaire dans Django
Basculer entre plusieurs modèles avec M5 Stick V
API GraphQL utilisant graphene_django dans Django
Deux façons d'afficher plusieurs graphiques dans une seule image avec matplotlib
Gérez plusieurs versions de python en un seul jupyter
Utilisation de plusieurs projets Django dans Apache (WSGIDaemonProcess)
Traiter plusieurs listes avec for en Python
Un serveur Web de ligne (avec CGI) en python
Ajouter dynamiquement des champs aux objets Form avec Django
Connectez plusieurs vidéos en un seul coup en utilisant OpenCV!
Démarrez Django dans un environnement virtuel à l'aide de Pipenv
Créez un environnement Django avec Vagrant en 5 minutes
Connectez-vous facilement à AWS avec plusieurs comptes
Plusieurs graphiques sont affichés dans une seule fenêtre (python)
[Python] Traitement de plusieurs erreurs d'appel dans ray.init
Implémentation de la fonction d'authentification dans Django REST Framework à l'aide de djoser
Formulaire de demande Django 2
Internationalisation avec Django
CRUD avec Django
Formulaire suggéré par Django
Je souhaite envoyer un message d'erreur en japonais avec le formulaire de changement de mot de passe django
Ramasser les oreilles tombées de Django Form
Formulaire à Django
Formulaire de contact Django
Comment obtenir plusieurs objets de modèle au hasard dans Django
Comment faire du zéro-padding sur une ligne avec OpenCV
Définissez DateField du formulaire sur type = date dans Django
Implémenter des URL hiérarchiques avec des routeurs imbriqués drf dans le framework Django REST
Comment enregistrer les mêmes données plusieurs fois avec une seule entrée sur l'écran de gestion de Django
[Django] Une histoire sur le fait de rester coincé dans un marais en essayant de valider un zip avec un formulaire [TDD]