web-dev-qa-db-fra.com

Plusieurs images par modèle

J'écris une simple application de référencement immobilier à Django. Chaque propriété doit avoir un nombre variable d'images. Les images doivent avoir une commande modifiable. Et je dois mettre l'administrateur à l'épreuve des utilisateurs.

Cela dit, quelles sont mes options?

  1. Y a-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 pourrais-je rendre le côté administrateur décent? J'imagine quelque chose de beaucoup plus lisse que ce que propose ImageField, avec un peu de drag'n'drop pour les réorganiser. Mais je suis un clutz complet pour écrire des pages d'administration = (

68
Oli
  1. Les listes de variables, également appelées relations plusieurs-à-un, sont généralement gérées en créant un modèle distinct pour le nombre et, dans ce modèle, en utilisant une clé étrangère pour le "un".

  2. Il n'y a pas d'application comme celle-ci dans Django.contrib, mais il existe plusieurs projets externes que vous pouvez utiliser, par exemple Django-photologue qui a même un certain support pour visualiser les images dans l'admin.

  3. Le site d'administration ne peut pas être rendu "à l'épreuve des utilisateurs", il ne doit être utilisé que par des utilisateurs de confiance. Compte tenu de cela, la façon de rendre votre site d'administration 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 ex. dans ce cas, vous pouvez faire quelque chose comme ceci à votre avis:

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

EDIT: oublié de mentionner, vous pouvez ensuite implémenter l'ordre de glisser-déposer dans l'administrateur en utilisant l'extrait de Simon Willison Inline commandable en utilisant le glisser-déposer avec jQuery UI

115
Van Gale

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

5
Javier

Je fais actuellement à peu près 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 fonctionnalité Nice 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 est le support de l'extension non JPEG. J'espère que j'aurai la solution pour cela dans quelques jours. :)

3
Adrian Liem