django admin – ajoute des champs de formulaire personnalisés qui ne font pas partie du modèle

J’ai un modèle enregistré dans le site d’administration. L’un de ses champs est une expression de chaîne longue. J’aimerais append des champs de formulaire personnalisés à la page d’ajout / mise à jour de ce modèle dans l’administrateur qui, en fonction de ces valeurs de champs, générera l’expression de chaîne longue et l’enregistrera dans le champ de modèle approprié.

Comment puis je faire ça?

UPDATE: Fondamentalement, ce que je fais est la construction d’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 lorsqu’il clique sur Enregistrer, je crée une représentation liste de symboles et la stocker dans la firebase database. Je ne veux pas que les symboles fassent partie du modèle et de la firebase database, seulement l’expression finale.

Soit dans votre admin.py ou dans un forms.py séparé, vous pouvez append une classe ModelForm et ensuite déclarer vos champs supplémentaires à l’intérieur de ce que vous feriez normalement. J’ai aussi donné un exemple de la façon dont vous pourriez utiliser ces valeurs dans form.save ():

from django import forms from yourapp.models import YourModel class YourModelForm(forms.ModelForm): extra_field = forms.CharField() def save(self, commit=True): extra_field = self.cleaned_data.get('extra_field', None) # ...do something with extra_field here... return super(YourModelForm, self).save(commit=commit) class Meta: model = YourModel 

Pour avoir les champs supplémentaires apparaissant dans l’administration juste:

  1. éditez votre admin.py et définissez la propriété de formulaire pour faire référence au formulaire que vous avez créé ci-dessus
  2. inclure vos nouveaux champs dans votre déclaration de champs ou de champs

Comme ça:

 class YourModelAdmin(admin.ModelAdmin): form = YourModelForm fieldsets = ( (None, { 'fields': ('name', 'description', 'extra_field',), }), ) 

UPDATE: Dans django 1.8, vous devez append des fields = '__all__' à la métaclasse de YourModelForm.

Il est possible de le faire dans l’administrateur, mais il n’y a pas de moyen très simple d’y parvenir. Aussi, je voudrais vous conseiller de garder la plupart de la logique métier dans vos modèles, afin de ne pas dépendre de l’administrateur de Django.

Peut-être que ce serait plus facile (et peut-être même mieux) si vous avez les deux champs distincts sur votre modèle. Ajoutez ensuite une méthode sur votre modèle qui les combine.

Par exemple:

 class MyModel(models.model): field1 = models.CharField(max_length=10) field2 = models.CharField(max_length=10) def combined_fields(self): return '{} {}'.format(self.field1, self.field2) 

Ensuite, dans l’admin, vous pouvez append le

 class MyModelAdmin(models.ModelAdmin): list_display = ('field1', 'field2', 'combined_fields') readonly_fields = ('combined_fields',) def combined_fields(self, obj): return obj.combined_fields() 

Si vous souhaitez stocker les combined_fields dans la firebase database, vous pouvez également l’enregistrer lorsque vous enregistrez le modèle:

 def save(self, *args, **kwargs): self.field3 = self.combined_fields() super(MyModel, self).save(*args, **kwargs) 

vous pouvez toujours créer un nouveau modèle d’administration et faire ce dont vous avez besoin dans votre admin_view (remplacez l’URL d’addition d’URL par votre admin_view):

  url(r'^admin/mymodel/mymodel/add/$' , 'admin_views.add_my_special_model') 

Si vous ne voulez absolument que stocker le champ combiné sur le modèle et non les deux champs séparés, vous pouvez faire quelque chose comme ceci:

Je n’ai jamais fait quelque chose comme ça, alors je ne suis pas tout à fait sûr de la façon dont cela fonctionnera.