J’écris une application simple d’annonce immobilière à Django. Chaque propriété doit avoir un nombre variable d’images. Les images doivent avoir un ordre éditable. Et je dois faire en sorte que l’administrateur soit à l’épreuve de l’utilisateur.
Cela dit, quelles sont mes options?
Y a-t-il un champ ImageList que je ne connais pas?
Existe-t-il une application comme django.consortingb.comments
qui fait le travail pour moi?
Si je dois l’écrire moi-même, comment ferais-je pour rendre le côté admin acceptable? J’imagine quelque chose de beaucoup plus lisse que ce que fournit ImageField, avec un peu de drag’n’drop pour la re-commande. Mais je suis un clutz complet à l’écriture des pages d’admin = (
Les listes de variables, également connues sous le nom de relations plusieurs-à-un, sont généralement traitées en créant un modèle distinct pour le multiple et, dans ce modèle, en utilisant une clé étrangère pour le “un”.
Il n’y a pas d’application comme celle-ci dans django.consortingb, mais il existe plusieurs projets externes que vous pouvez utiliser, par exemple django-photologue, qui a même un support pour visualiser les images dans l’administrateur.
Le site d’administration ne peut pas être “protégé par l’utilisateur”, il ne doit être utilisé que par des utilisateurs de confiance. Compte tenu de cela, le moyen de rendre votre site admin décent serait de définir un ModelAdmin pour votre propriété, puis d’inclure les photos ( documentation en ligne ).
Donc, pour vous donner quelques brouillons 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 ForeignKey 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: oublié de mentionner, vous pouvez ensuite mettre en place un ordre de glisser-déposer dans l’admin en utilisant l’extrait de code de Simon Willison inline commandable par glisser-déposer avec l’interface utilisateur jQuery
Ecrivez un modèle d’image qui possède un ForeignKey dans votre modèle de propriété. Très probablement, vous aurez d’autres champs qui appartiennent à l’image et non à la propriété.
Je suis en train de faire la même chose et j’ai fait face au 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 fonctionnalité 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 modifiables. La seule chose qui lui manque, c’est le support de l’extension non-JPEG. J’espère que je vais avoir la solution pour cela dans quelques jours. 🙂