2016-08-04 2 views
0

Je suis relativement nouveau à django (1,8) et ont lu autour de cette question que tous les points à Outrepasser la fonction save_formset selon ce lienDjango admin - sauver inline prépondérants save_formset

https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_formset

ajoutés à votre panier un ancien fil (Django admin - how to save inlines?), mais voulait augmenter comme un fil séparé pour obtenir une meilleure visibilité et d'ailleurs cela a déjà été répondu.

La fonction ci-dessous fonctionne lorsque j'essaie de modifier le formulaire avant de l'enregistrer, c'est-à-dire mettre à jour les champs d'audit (créés/modifiés) vers USER et minuscules l'attribut 'enum_value_en'. Tout fonctionne lorsque l'utilisateur entre seulement 1 entrée, mais en ajoutant plus il met à jour toutes les entrées avec la même valeur (par exemple « enum_value_en » dans la base de données.

def save_formset(self, request, form, formset, change): 
    instances = formset.save(commit=False) # gets instance from memory and add to it before saving it 
    for obj in formset.deleted_objects: 
     obj.delete() 
    for instance in instances: 
     for form in formset: # cleaned_data is only available on the form, so you have to iterate over formset 
      instance.modified_by = request.user 
      instance.created_by = request.user 
      instance.lowercase_enum_value_en = form.cleaned_data['enum_value_en'].lower() 
      instance.save() 
    formset.save_m2m() 
  • Ex.

    si les entrées sont « un '& 'b', les attributs minuscules sont mis à 'b' sur les deux dossiers.

PS. est-ce aussi reconnaissant si quelqu'un pouvait o Quelques commentaires sur leurs suggestions afin que je puisse comprendre chaque ligne de code.

Le plus apprécié.

Répondre

0

Le problème est que vous êtes en boucle sur les instances, puis en boucle sur les formsets à l'intérieur. Dites qu'il y a 5 formulaires, cela signifie que vous sauvegardez chaque instance 5 fois, une fois pour chaque instance. Chaque instance se retrouvera avec la même valeur dans le formset final.

Dans ce cas, je ne pense pas que vous devez accéder au formulaire cleaned_data. Accédez simplement à l'attribut enum_value_en de l'instance. Cela signifie que vous n'avez pas besoin de la boucle interne à l'origine de votre problème.

for instance in instances: 
    instance.lowercase_enum_value_en = instance.enum_value_en.lower() 
    instance.modified_by = request.user 
    instance.created_by = request.user 
    instance.save() 
+0

Merci Alasdair pour la solution et l'explication - cela a fonctionné. J'ai passé énormément de temps à essayer de résoudre ce problème. Frustrant dans notre environnement de développement, nous utilisons un superviseur pour redémarrer les services et nous essayons d'utiliser un débogueur interactif comme Werkzeug, mais nous ne le pouvons pas. ** Pouvez-vous suggérer quelque chose **. Encore merci. –

+0

Désolé, je n'ai aucune suggestion sur les débogueurs interactifs. – Alasdair

+0

Merci tout de même. –