75 votes

Plusieurs images par modèle

J'écris une application simple d'annonces immobilières en Django. Chaque propriété doit avoir un nombre variable d'images. Les images doivent avoir un ordre modifiable. Et je dois rendre l'administration facile à utiliser.

Cela dit, quelles sont mes options ?

  1. Existe-t-il un champ ImageList que je ne connais pas ?

  2. Existe-t-il une application comme django.contrib.comments qui fait le travail pour moi ?

  3. Si je dois l'écrire moi-même, comment dois-je m'y prendre pour rendre le côté administration décent ? J'imagine quelque chose de beaucoup plus simple que ce que ImageField fournit, avec un peu de drag'n'drop pour réordonner. Mais je suis complètement nul pour écrire des pages d'administration =(

142voto

Van Gale Points 21982
  1. Les listes de variables, également connues sous le nom de relation "many-to-one", sont généralement traitées en créant un modèle distinct pour le "many" et, dans ce modèle, en utilisant un ForeignKey pour le "one".

  2. Il n'y a pas d'application de ce type dans django.contrib, mais il existe plusieurs projets externes que vous pouvez utiliser, par ex. django-photologue qui permet même de visualiser les images dans l'administration.

  3. Le site d'administration ne peut pas être "à l'épreuve des utilisateurs", il ne doit être utilisé que par des utilisateurs de confiance. Dans ces conditions, la façon de rendre votre site d'administration décent serait de définir un ModelAdmin pour votre propriété, puis d'intégrer les photos ( documentation en ligne ).

Donc, pour vous donner quelques ébauches rapides, tout ressemblerait à ceci :

# models.py
class Property(models.Model):
    address = models.TextField()
    ...

class PropertyImage(models.Model):
    property = models.ForeignKey(Property, related_name='images')
    image = models.ImageField()

et :

# admin.py
class PropertyImageInline(admin.TabularInline):
    model = PropertyImage
    extra = 3

class PropertyAdmin(admin.ModelAdmin):
    inlines = [ PropertyImageInline, ]

admin.site.register(Property, PropertyAdmin)

La raison de l'utilisation de l'argument related_name sur la clé étrangère est que vos requêtes seront plus lisibles, par exemple, dans ce cas, vous pouvez faire quelque chose comme ceci dans votre vue :

property = Property.objects.get(pk=1)
image_list = property.images.all()

EDIT : j'ai oublié de mentionner que vous pouvez ensuite mettre en œuvre le classement par glisser-déposer dans l'administration en utilisant le code de Simon Willison. Des lignes commandables par glisser-déposer avec jQuery UI

1 votes

Le modèle PropertyImage doit inclure un champ pour la commande.

1 votes

Merci, incroyable ! Le snippet orderable fonctionne très bien, après un léger changement, car il n'est pas écrit pour les FileFields. La ligne 59 doit devenir "if ($(this).find('input[type=file]').val() || $(this).find('p.file-upload').length) {" pour vérifier si un fichier a déjà été téléchargé, ou si un fichier est en attente de téléchargement. De plus, cela fonctionne sur une StackedInline, et non sur une TabularInline (en tout cas, pas dans la boîte).

0 votes

Comment supprimer ces images depuis l'administration ?

7voto

Javier Points 33134

Rédigez un modèle d'image qui possède une clé étrangère à votre modèle de propriété. Très probablement, vous aurez d'autres champs qui appartiennent à l'image et non à la propriété.

4voto

Adrian Liem Points 106

Je suis en train de faire la même chose, et j'ai rencontré le même problème.

Après avoir fait des recherches pendant un certain temps, j'ai décidé d'utiliser django-imaging . Il a une belle Ajax les images peuvent être téléchargées sur la même page que la page d'insertion du modèle, et peuvent être modifiées. La seule chose qui manque est le support de l'extension non-JPEG. J'espère que je trouverai une solution dans quelques jours :)

0voto

Dzhuang Points 1475

Il existe un paquet nommé django-galleryfield . Je pense qu'il répondra à votre demande.

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