142 votes

Ajouter des champs de formulaire personnalisés qui ne font pas partie du modèle (Django)

J'ai un modèle enregistré sur le site d'administration. L'un de ses champs est une longue expression de type chaîne. J'aimerais ajouter des champs de formulaire personnalisés aux pages d'ajout et de mise à jour de ce modèle dans l'administration. Sur la base des valeurs de ces champs, je construirai l'expression de longue chaîne et l'enregistrerai dans le champ du modèle concerné.

Comment puis-je le faire ?

Je construis une expression mathématique ou une expression de chaîne de caractères à partir de symboles. L'utilisateur choisit des symboles (il s'agit de champs personnalisés qui ne font pas partie du modèle) et lorsqu'il clique sur "Enregistrer", je crée une représentation de l'expression de chaîne à partir de la liste de symboles et je la stocke dans la base de données. Je ne veux pas que les symboles fassent partie du modèle et de la base de données, seulement l'expression finale.

1voto

Kai Points 350

C'est ce que j'ai fait pour ajouter le champ personnalisé "extra_field" du formulaire qui n'est pas la partie de le modèle "MonModèle" comme indiqué ci-dessous :

# "models.py"

from django.contrib import admin
from django import forms
from .models import MyModel

class MyModelForm(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().save(commit=commit)

@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):

    form = MyModelForm

0voto

G-2 Points 11

Vous pouvez trouver de l'aide dans ma réponse à : ma réponse précédente sur le champ personnalisé multicheckchoice

Vous pouvez également étendre plusieurs formulaires comportant des champs personnalisés différents et les affecter à votre classe d'inlines comme stackedinline ou tabularinline :

formulaire =

De cette façon, vous pouvez éviter la complication des jeux de formulaires où vous devez ajouter plusieurs champs personnalisés à partir de plusieurs modèles.

ainsi votre modeladmin ressemble à :

inlines = [form1inline, form2inline,...]

Dans ma réponse précédente au lien ici, vous trouverez les méthodes init et save.

init se chargera lorsque vous afficherez la page et save l'enverra à la base de données.

dans ces deux méthodes, vous pouvez faire votre logique pour ajouter des chaînes de caractères et ensuite les sauvegarder et les afficher dans l'administration Django change_form ou change_list selon ce que vous voulez. list_display affichera vos champs sur change_list. Faites-moi savoir si cela vous aide ... ....

class CohortDetailInline3(admin.StackedInline):
    model = CohortDetails
    form =  DisabilityTypesForm
...

class CohortDetailInline2(admin.StackedInline):
    model = CohortDetails
    form =  StudentRPLForm

... ...

@admin.register(Cohort)
class CohortAdmin(admin.ModelAdmin):         
        form = CityInlineForm
        inlines = [uploadInline,   cohortDetailInline1,
        CohortDetailInline2, CohortDetailInline3]

        list_select_related = True

        list_display = ['rto_student_code', 'first_name', 'family_name',]

...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X