Django: fait varier le nombre de formulaires enfants en fonction du nombre d'éléments d'entrée

Modifiez le nombre de formulaires enfants de Companion par le nombre de commandes saisies (unités).

Je ne sais pas comment faire, alors je vais l'essayer de force. ::

    if request.method == "POST":

          form = OrderForm(user=request.user,
                           ticket=ticket, data=request.POST)
          #: Order(commande)
          is_form_valid = form.is_valid()
  
          #: Companion (Personne accompagnante)
          formset = create_companion_formset(
              request, order=form.instance)            
          is_formset_valid = formset.is_valid()

          number = int(form.cleaned_data.get('units', 1)) 
          if number != len(formset.forms):
          
              #:Parce qu'il y a eu un changement dans le nombre....
              is_formset_valid = False
              old = formset
              
              #:Recréez l'ensemble de formulaires avec un nouveau numéro
              formset = create_companion_formset(None, extra=number)
              
              #:faire une copie
              for i in range(min(number, len(old.forms))):
                  formset.forms[i] = old.forms[i]
          
         if is_form_valid and is_forset_valid:
             form.save()
             formset.save()
             
         #:.....

Saisie obligatoire du formulaire enfant ajouté:

    class OrderCompanionFormset(BaseInlineFormSet):

        def clean(self):
            for i in range(self.total_form_count()):
                if not self.forms[i].has_changed():
                    _errs = self.forms[i].error_class(
                        [_("Form must be filled.")])
                    self.forms[i].errors['__all__'] = _errs 

Usine Formset:

    def create_companion_formset(request, order=None, extra=1, *args, **kwargs):
        '''Créer un ensemble de formulaires compagnon'''
        kwargs['form'] = CompanionForm
        kwargs['can_delete'] = False
        kwargs['formset'] = OrderCompanionFormset
    
        #:Ordinaire
        if request and request.method == "POST":
            formset = inlineformset_factory(
                Order, Companion,
                *args, **kwargs)(request.POST, instance=order)
    
        else:
            formset = inlineformset_factory(
                Order, Companion, extra=extra,
                *args, **kwargs)(instance=order)
    
        return formset                    

Le message _errs apparaît dans non_form_erros:

    {% for form in formset %}
    <h4>Personne accompagnante</h4>
    {% if form.non_form_errors %}
    <div class="alert alert-error">{{ from.non_form_error.as_text }}</div>
    {% endif %}
	....
    {% endfor %}                                                                  

Recommended Posts

Django: fait varier le nombre de formulaires enfants en fonction du nombre d'éléments d'entrée
Différence de résultats en fonction de l'argument du multiprocessus.
Comptez le nombre de caractères dans le texte dans le presse-papiers sur Mac
Jusqu'au début du tutoriel django avec pycharm sous Windows
10. Compter le nombre de lignes
Obtenez le nombre de chiffres
Calculez le nombre de changements
[Django] Corrige le pluriel du nom du modèle sur l'écran de gestion
Obtenez le nombre de lecteurs d'articles sur Mendeley en Python
L'histoire de l'échec de la mise à jour de "calendar.day_abbr" sur l'écran d'administration de django
Comprendre le nombre de paramètres d'entrée / sortie du réseau neuronal convolutif
Obtenez le nombre de vues de Qiita
Calcul du nombre d'associations de Klamer
Essayez Ajax sur la page Django
Obtenez le nombre d'abonnés Youtube
Modifions automatiquement la palette de couleurs d'iTerm2 en fonction de l'heure de la journée
[Java] [Linux] Etude de la manière dont l'implémentation des processus enfants Java sous Linux est réalisée
Le processus d'extraction répétée d'un tableau diffère légèrement selon la langue ...
TLE semblait effrayant en fonction de la manière dont l'entrée était reçue