Parce qu'il y a un blanc dans le calendrier de l'Avent ...
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.
pip install django-extra-views
Faites-le parce que les vues supplémentaires de django peuvent être atteintes sans utiliser de classe de formulaire.
CreateView
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 = "/"
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
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 = "/"
le même
Très pratique.
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