2009-02-11 9 views
60

Je suis en train d'écrire une application de listing immobilier simple dans Django. Chaque propriété doit avoir un nombre variable d'images. Les images doivent avoir une commande modifiable. Et je dois rendre l'administration à l'épreuve des utilisateurs.Plusieurs images par modèle

Cela dit, quelles sont mes options?

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

  2. Y at-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é admin décent? J'imagine quelque chose de beaucoup plus brillant que ce qu'offre ImageField, avec un peu de drag'n'drop pour re-commander. Mais je suis un clutz complet à l'écriture de pages admin = (

Répondre

94
  1. listes variables, également connu comme beaucoup à une relation, sont généralement traitées en faisant un modèle distinct pour les nombreux et, dans ce modèle, en utilisant un ForeignKey à la « une »

  2. Il n'y a pas une application comme celle-ci dans django.contrib, mais il y a projets externes virtuels que vous pouvez utiliser, par ex. django-photologue qui a même un certain soutien pour visualiser les images dans l'admin.

  3. Le site d'administration ne peut pas être rendu "user-proof", 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 en ligne les photos (inline documentation).

Donc, pour vous donner quelques projets rapides, tout ressemblerait à quelque chose comme 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 d'utiliser l'argument related_name sur le ForeignKey est donc 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 mettre en œuvre glisser-déposer commande dans l'administration à l'aide de l'extrait de Simon Willison Orderable inlines using drag and drop with jQuery UI

+1

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

+2

C'était un sauveur ... Merci beaucoup –

+1

Merci, incroyable!L'extrait de commande fonctionne très bien, après un léger changement, car il n'est pas écrit pour FileFields. La ligne 59 doit devenir "if ($ (this) .find ('input [type = fichier]'). Val() || $ (this) .find ('p.file-upload'). Longueur) {" pour vérifier si un fichier a déjà été téléchargé ou si un fichier est en attente de téléchargement. En outre, il fonctionne sur un StackedInline, pas un TabularInline (hors de la boîte, de toute façon). – mrooney

5

Ecrire un modèle d'image qui a un ForeignKey à votre modèle de propriété. Très probablement, vous aurez d'autres champs qui appartiennent à l'image et non à la propriété.

3

Je 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 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 peut être éditable. La seule chose qui lui manque est la prise en charge de l'extension non-JPEG. J'espère que je vais avoir la solution pour cela dans les jours. :)

Questions connexes