Django-fr

Forum

  • Accueil
  • » Django-fr
  • » [Résolu] Modifier ModelAdmin.form pour nouvelle instance

#1 13-05-2011 09:37:34

serge
Membre
Inscription : 13-05-2011
Messages : 6

[Résolu] Modifier ModelAdmin.form pour nouvelle instance

Bonjour.
J'utilise Django depuis deux semaines pour un petit site d'article (comprendre article de journal).

Théoriquement, voilà ce que je voudrais pour la création d'un article.
1) L'utilisateur défini le titre de l'article via un model.CharField.
2) L'utilisateur défini la date de parution via un model.DateField.
3) L'utilisateur envoie une archive contenant une page html et des images. (Converti depuis un fichier .odt de LibreOffice)

Ensuite, pour la modification de l'article, je voudrais avoir la possibilité de :
1) Modifier le titre.
2) Modifier la date.
3) Modifier l'article html en utilisant tinymce.


Pour tout ce qui est titre et date, pas de problème. Pour l'article, je bloque.
Je voudrais juste uploader l'archive, la décompresser et modifier deux-trois trucs dans le fichier html, sans rien enregistrer encore dans la base de données sqlite3.
Ensuite, j'enregistre le fichier html comme un TextField dans la base de donnée. Et à partir de là, je peux modifier l'article via TinyMCE.

En gros, c'est créer un model.FileField temporaire qui me gène. Je n'y arrive pas du tout. Pour tout ce qui est modification en python (décompresser, et parser le fichier), je sais faire, pas de problème.

J'ai peur de ne pas être assez clair. Si c'est le cas, je reformulerai.
En vous remerciant par avance.

Dernière modification par serge (13-05-2011 23:25:17)

Hors ligne

#2 13-05-2011 09:48:30

Florian Strzelecki
Membre
Inscription : 11-08-2010
Messages : 40

Re : [Résolu] Modifier ModelAdmin.form pour nouvelle instance

Bonjour,

Alors, en gros, tu as besoin d'un model.FileField, et d'un model.TextField.
La méthode la plus simple, c'est encore de mettre ces deux champs dans ton
modèle, de ne pas les mettre en obligatoire, et de modifier la fonction
"save" de ton modèle, pour effectuer le traitement de données du FileField
vers le TextField.

La question est : qu'est-ce qui te dérange avec le FileField ?
Tout ce qui sera enregistré en base de données, c'est le chemin d'accès au
fichier, pas plus, pas moins : et tu dois même pouvoir vider le contenu du
FileField pour qu'il n'enregistre rien du tout.

Bref, quel est le problème avec le Filefield ? :-)

Le 13 mai 2011 10:37, serge <kilimoff _AT_ yahoo.fr> a écrit :

> Bonjour.
> J'utilise Django depuis deux semaines pour un petit site d'article
> (comprendre article de journal).
>
> Théoriquement, voilà ce que je voudrais pour la création d'un article.
> 1) L'utilisateur défini le titre de l'article via un model.CharField.
> 2) L'utilisateur défini la date de parution via un model.DateField.
> 3) L'utilisateur envoie une archive contenant une page html et des images.
> (Converti depuis un fichier .odt de LibreOffice)
>
> Ensuite, pour la modification de l'article, je voudrais avoir la
> possibilité de :
> 1) Modifier le titre.
> 2) Modifier la date.
> 3) Modifier l'article html en utilisant tinymce.
>
>
> Pour tout ce qui est titre et date, pas de problème. Pour l'article, je
> bloque.
> Je voudrais juste uploader l'archive, la décompresser et modifier
> deux-trois trucs dans le fichier html, sans rien enregistrer encore dans la
> base de données sqlite3.
> Ensuite, j'enregistre le fichier html comme un TextField dans la base de
> donnée. Et à partir de là, je peux modifier l'article via TinyMCE.
>
> En gros, c'est créer un model.FileField temporaire qui me gène. Je n'y
> arrive pas du tout. Pour tout ce qui est modification en python
> (décompresser, et parser le fichier), je sais faire, pas de problème.
>
> J'ai peur de ne pas être assez clair. Si c'est le cas, je reformulerai.
> En vous remerciant par avance.
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django
>

Hors ligne

#3 13-05-2011 09:52:08

Rémy HUBSCHER
Membre
Inscription : 11-08-2010
Messages : 161

Re : [Résolu] Modifier ModelAdmin.form pour nouvelle instance

Il faut que tu créé un formulaire contenant un filefield avec un
temporary storage mais sans le TextField et dans la méthode save du
form, tu vas lire le fichier et renseigner la variable article.

Si tu veux que ce formulaire soit utilisé dans l'admin, il faut que tu
le spécifie en modifiant l'attribut add_form de ton ModelAdmin

     add_form = UserCreationForm

Hors ligne

#4 13-05-2011 17:07:31

serge
Membre
Inscription : 13-05-2011
Messages : 6

Re : [Résolu] Modifier ModelAdmin.form pour nouvelle instance

Merci de vos réponse, et surtout de votre réactivité ! J'étais impressionné en lisant des réponses seulement après 10 minutes.

Je n'ai pas répondu tout de suite, parce que j'ai essayé de comprendre ce que vous m'expliquiez, et de trouver une solution par moi-même à partir de là.
J'ai opté pour la solution de Rémy HUBSCHER, vu que je n'ai plus besoin du fichier par la suite, seulement son contenu.

Ça m'a pris du temps pour comprendre les formulaires, mais je crois que je commence à voir le bout du tunnel.

Toutefois, en cherchant dans la documentation de Django l'attribut add_form de ModelAdmin, je n'ai rien trouvé. Une recherche Google m'emmène sur un fil de ce forum : http://forum.django-fr.org/viewtopic.php?id=470
En fouillant dans django/contrib/auth/admin.py, j'ai bien l'attribut add_form, mais je ne parviens pas à l'utiliser.

Mon code minimal :

class ArticleAdmin(admin.ModelAdmin):
    add_form = ArticleAdminForm
        # form = ArticleAdminForm     <= Avec form, ça fonctionne

Bon, je continue à chercher pour utiliser add_form, qui a l'air pratique.

Edit: En lisant plus attentivement le code de django/contrib/auth/admin.py, j'ai l'impression que add_form fait référence à la création d'un nouvel utilisateur.
Il n'apparaît pas du tout dans django/contrib/admin/options.py (où se situe ModelAdmin et BaseModelAdmin).

Dernière modification par serge (13-05-2011 17:47:42)

Hors ligne

#5 13-05-2011 23:23:25

serge
Membre
Inscription : 13-05-2011
Messages : 6

Re : [Résolu] Modifier ModelAdmin.form pour nouvelle instance

Désolé pour répondre deux fois d'affilée. Mais après une journée de recherche, un début de réponse.

En analysant encore django/contrib/admin/options.py, j'ai compris le truc de add_form.
Donc, en gros, voilà le code modifié :

class ArticleAdminForm(forms.ModelForm):
    class Meta:
        model = Article
    fichier = forms.FileField()

class ArticleAdmin(admin.ModelAdmin):
    def get_form(self, request, obj=None):
        default = {}
        if obj is None:
            default.update({'form': ArticleAdminForm})
        return super(ArticleAdmin, self).get_form(request, obj, **default)

admin.site.register(Article, ArticleAdmin)

Maintenant, les soucis ne sont pas finis, je pense. Je pense en particulier pour envoyer les données de "fichier" dans "ArticleAdminForm" vers une fonction pour extraire l'archive et transformer les fichiers. Mais je verrais tout cela demain.

Je passe en résolu.
Merci !

Hors ligne

  • Accueil
  • » Django-fr
  • » [Résolu] Modifier ModelAdmin.form pour nouvelle instance

Pied de page des forums