En passant initiale dans Django ModelFormSet
J'ai un modèle formset que j'ai besoin de passer le mot-clé initial pour (avoir certaines valeurs initiales dans l'ensemble, comme la date fixée pour aujourd'hui). Aussi loin que je peux dire, le queryset argument (qui est par défaut YourModel.objets.tous les()) l'emporte sur cette capacité de vide initial formes d'être créé. J'ai précisé le queryset comme: YourModel.objets.none (aucun), ce qui l'empêche de remplir le formset avec les entrées de la base de données, mais je n'arrive toujours pas à comprendre comment passer initiale efficace. Ai-je besoin à la sous-classe d'une méthode de ModelForm?
- Vous souhaitez modifier une instance particulière du modèle, mais vous ne voulez pas afficher ses valeurs et les afficher à la place des valeurs initiales différentes?
Vous devez vous connecter pour publier un commentaire.
Vous êtes de passage à vide queryset à ModelFormset.
qui est en effet le moyen d'atteindre ce que vous voulez. Il est logique de passer un vide queryset, d'autre valeurs initiales remplace le modèle de base de données de la valeur.
Et si je suppose que vous êtes de passage à un non-vide queryset, et veulent encore vos formulaires à remplir sera de valeurs initiales, vous pouvez remplacer la
Formset
.Remarque:
initial
est la liste des dicts. Ses souhaitable de disposer d'éléments dans la liste exactement égal au nombre de supplémentaires.Nouveau dans Django 1.4 ...si vous définissez initiale sur un modelformset désormais, elle ne s'applique que pour les "extra" formes, et non pas celles qui sont liées à des instances de la queryset:
https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#providing-initial-values
Donc les différents hacks ci-dessus ne sont plus nécessaires et l'aide initiale est la réponse.
Le meilleur moyen que j'ai trouvé à faire est de régler manuellement l'ensemble de l'objet "extra" de l'attribut après l'initialisation. Cela a été testé et fonctionne dans Django 1.9.
Cela générera 3 formes (2 préenregistrés et 1 blanc).
Si vous voulez quelque chose de plus dynamique (par exemple,
initial
est une var calculée ailleurs), vous pouvez faire quelque chose comme ceci:Espère que ça aide.
Il est toujours possible de passer initiale à un ModelFormSet.
Si ce n'est pas ce que vous recherchez, pouvez-vous expliquer votre question.
EDIT:
Dans Django 1.4 la règle a changé: le nombre d'initiales à être affichée correspond à celle de "extra" paramètre.
https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#providing-initial-values
Dans mon cas, le nombre de paramètres varie dynamiquement, donc
J'ai trouvé la manière suivante:
fourni, ExampleModelFormSet est basé sur MyBaseFormSet
Une solution simple pourrait être que vous passez une forme qui s'étend d'un modelform() pour un formset (plutôt que modelformset).
De cette façon, vous pouvez définir les valeurs initiales dans le formulaire.
Je pense que vous pouvez utiliser l'argument initial, comme régulièrement formsets
http://docs.djangoproject.com/en/dev/topics/forms/formsets/#using-initial-data-with-a-formset
Vous pouvez modifier les données initiales par la suite.
Par exemple:
'str' object has no attribute 'initial'
Que pouvais-je fait de mal?form.fields
retourne. Ce code pourrait avoir besoin d'une correction.La manière la plus simple de savoir comment passer des données initiales avec le même nombre de supplémentaires formes:
Utilisation dans les vues:
Affter deux jours trouvé ceci: http://streamhacker.com/2010/03/01/django-model-formsets/