J'ai un modèle enregistré sur le site d'administration. L'un de ses champs est une expression de chaîne longue. Je voudrais ajouter des champs de formulaire personnalisés à la page d'ajout / de mise à jour de ce modèle dans l'administrateur qui, sur la base de ces valeurs de champs, je créerai la longue expression de chaîne et l'enregistrerai dans le champ de modèle approprié.
Comment puis je faire ça?
MISE À JOUR: Fondamentalement, ce que je fais est de créer une expression mathématique ou de chaîne à partir de symboles, l'utilisateur choisit des symboles (ce sont les champs personnalisés qui ne font pas partie du modèle) et quand il clique sur Enregistrer, je crée une représentation d'expression de chaîne à partir du liste des symboles et enregistrez-la dans la base de données. Je ne veux pas que les symboles fassent partie du modèle et DB, seulement l'expression finale.
fields = '__all__'
dans votreMeta
classe, sinon django se plaint:Creating a ModelForm without either the 'fields' attribute or the 'exclude' attribute is deprecated
YourModelAdmin.list_display[0], 'extra_field' is not a callable or an attribute of 'YourModelAdmin' or found in the model 'YourModel'.
AttributeError: Unable to lookup "extra_field"...
, essayez d'ajouter unlabel
à laextra_field
définition. Il semble que django essaie de "deviner" son étiquette, en regardant leModel
et leModelAdmin
pour une telle définition d'attribut.Unknown field(s) (extra_field) specified for YourModel. Check fields/fieldsets/exclude attributes of class YourModelAdmin.
. La solution de contournement pour cela estextra_field = forms.CharField(widget=forms.HiddenInput())
Il est possible de le faire dans l'administrateur, mais il n'y a pas de moyen très simple de le faire. De plus, je voudrais vous conseiller de conserver la plupart de la logique métier dans vos modèles, afin que vous ne soyez pas dépendant de l'administrateur Django.
Peut-être que ce serait plus facile (et peut-être même mieux) si vous avez les deux champs séparés sur votre modèle. Ajoutez ensuite une méthode sur votre modèle qui les combine.
Par exemple:
Ensuite, dans l'administrateur, vous pouvez ajouter le
combined_fields()
champ en lecture seule:Si vous souhaitez stocker le
combined_fields
dans la base de données, vous pouvez également l'enregistrer lorsque vous enregistrez le modèle:la source
save()
méthode du modèle , vérifier les mises à jour de ma réponse.Django 2.1.1 La réponse principale m'a amené à mi-chemin à répondre à ma question. Cela ne m'a pas aidé à enregistrer le résultat dans un champ de mon modèle actuel. Dans mon cas, je voulais un champ de texte dans lequel un utilisateur pourrait entrer des données, puis lorsqu'une sauvegarde se produisait, les données seraient traitées et le résultat placé dans un champ du modèle et sauvegardé. Alors que la réponse originale montrait comment obtenir la valeur du champ supplémentaire, elle ne montrait pas comment la sauvegarder dans le modèle au moins dans Django 2.1.1
Cela prend la valeur d'un champ personnalisé non lié, traite et l'enregistre dans mon champ de description réel:
la source
vous pouvez toujours créer un nouveau modèle d'administrateur et faire ce dont vous avez besoin dans votre admin_view (remplacer l'URL d'ajout d'admin à votre admin_view):
la source
Si vous ne voulez absolument stocker que le champ combiné sur le modèle et non les deux champs séparés, vous pouvez faire quelque chose comme ceci:
form
attribut sur votreModelAdmin
( https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.form )save_formset
méthode sur votreModelAdmin
( https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_model )Je n'ai jamais fait quelque chose comme ça, donc je ne suis pas tout à fait sûr de savoir comment cela fonctionnera.
la source