2009-02-11 12 views
60

Sto scrivendo una semplice app di annunci immobiliari in Django. Ogni proprietà deve avere un numero variabile di immagini. Le immagini devono avere un ordine modificabile. E ho bisogno di rendere l'amministratore a prova di utente.Immagini multiple per modello

Detto questo, quali sono le mie opzioni?

  1. C'è un campo ImageList che io non so?

  2. Esiste un'applicazione come django.contrib.comments che svolge il lavoro per me?

  3. Se devo scrivere da solo, come farei per rendere il lato amministratore decente? Sto immaginando qualcosa di molto più sfaccettato di quello che offre ImageField, con alcuni drag'n'drop per il riordino. Ma io sono un clutz completo a scrivere pagine di amministrazione = (

risposta

94
  1. elenchi di variabili, noto anche come una relazione molti-a-uno, di solito sono gestite facendo un modello separato per i molti e, a quel modello, utilizzando un ForeignKey a "uno"

  2. Non c'è un'applicazione come questa in django.contrib, ma ci sono progetti esterni verali che puoi utilizzare, ad es. django-photologue che ha anche qualche supporto per la visualizzazione delle immagini nell'amministratore.

  3. Il sito di amministrazione non può essere reso "user proof", deve essere utilizzato solo da utenti fidati. Detto questo, il modo per rendere decente il tuo sito di amministrazione sarebbe definire un ModelAdmin per la tua proprietà e quindi incorporare le foto (inline documentation).

Così, per darvi alcune bozze veloci, tutto sarebbe simile a questa:

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

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

e:

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

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

admin.site.register(Property, PropertyAdmin) 

La ragione per usare l'argomento related_name sul ForeignKey è quindi le tue domande saranno più leggibili, ad es in questo caso si può fare qualcosa di simile a suo avviso:

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

EDIT: dimenticato di menzionare, è possibile quindi implementare ordinamento drag-and-drop in admin utilizzando frammento di Simon Willison Orderable inlines using drag and drop with jQuery UI

+1

Il modello PropertyImage dovrebbe includere un campo per l'ordine. – akaihola

+2

Questo era un Salvatore ... Grazie mille –

+1

Grazie, fantastico!Lo snippet ordinabile funziona alla grande, dopo una leggera modifica, poiché non è scritto per FileFields. La riga 59 deve diventare "if ($ (this) .find ('input [type = file]'). Val() || $ (this) .find ('p.file-upload'). Length) {" per verificare se ha già caricato un file o ha un file in attesa di caricamento. Inoltre, funziona su StackedInline, non su TabularInline (fuori dalla scatola, comunque). – mrooney

5

Scrivi un modello di immagine che ha un ForeignKey al modello di proprietà. Molto probabilmente, avrete alcuni altri campi che appartengono all'immagine e non alla proprietà.

3

I' Attualmente sto facendo la stessa cosa, e ho affrontato lo stesso problema.

Dopo aver ricercato per un po ', ho deciso di utilizzare django-imaging. Ha una bella funzione Ajax, le immagini possono essere caricate nella stessa pagina del modello Inserisci pagina e possono essere modificabili. L'unica cosa che manca è il supporto per l'estensione non JPEG. Spero di avere la soluzione per questo in pochi giorni. :)

Problemi correlati