2009-02-11 21 views
60

Ich schreibe eine einfache Immobilien-App in Django. Jede Eigenschaft muss eine variable Anzahl von Bildern haben. Bilder müssen eine bearbeitbare Reihenfolge haben. Und ich muss den Admin benutzerfreundlich machen.Mehrere Bilder pro Modell

Also das sagte, was sind meine Optionen?

  1. Gibt es ein ImageList-Feld, von dem ich nichts weiß?

  2. Gibt es eine App wie django.contrib.comments, die die Arbeit für mich erledigt?

  3. Wenn ich es selbst schreiben muss, wie würde ich die Admin-Seite in Ordnung bringen? Ich stelle mir etwas viel schlauer vor als was ImageField bietet, mit etwas Drag'n'Drop zum Nachbestellen. Aber ich bin ein komplettes clutz auf Admin-Seiten zu schreiben = (

Antwort

94
  1. Variablenlisten, auch als viele-zu-eins-Beziehung, sind in der Regel, indem sie ein separates Modell für die vielen und in diesem Modell unter Verwendung eines ForeignKey zum „one“ behandelt bekannt .

  2. Es gibt keine App wie diese in django.contrib, aber es gibt se verschiedene externe Projekte, die Sie verwenden können, z. django-photologue, die sogar einige Unterstützung für die Anzeige der Bilder im Admin hat.

  3. Die Admin-Site kann nicht benutzerfreundlich gemacht werden, sie sollte nur von vertrauenswürdigen Benutzern verwendet werden. In Anbetracht dessen besteht die Möglichkeit, Ihre Admin-Site anständig zu gestalten, darin, einen ModelAdmin für Ihre Property zu definieren und dann die Fotos zu inline (inline documentation).

Also, Sie einige schnelle Entwürfe zu geben, wäre alles in etwa so aussehen:

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

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

und:

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

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

admin.site.register(Property, PropertyAdmin) 

Der Grund für die ForeignKey das related_name Argument für die Verwendung ist So werden Ihre Abfragen besser lesbar, z in diesem Fall, dass Sie so etwas wie dies Ihrer Meinung nach tun können:

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

EDIT: vergessen zu erwähnen, Sie können dann per Drag-and-Drop-Bestellung im Admin mit Simon Willison des Schnipsel Orderable inlines using drag and drop with jQuery UI

+1

Das PropertyImage-Modell sollte ein Feld zum Bestellen enthalten. – akaihola

+2

Dies war ein Retter ... Danke eine Tonne –

+1

Danke, erstaunlich!Das orderable Snippet funktioniert nach einer kleinen Änderung sehr gut, da es nicht für FileFields geschrieben wird. Zeile 59 muss "if ($ (this) .find ('input [type = file]') werden. Val() || $ (this) .find ('p.file-upload'). Length) {" um zu überprüfen, ob entweder bereits eine Datei hochgeladen wurde oder eine Datei hochgeladen wurde. Außerdem funktioniert es auf einer StackedInline, nicht auf einer TabularInline (sowieso out of the box). – mrooney

5

ein Bild Modell schreiben, die eine ForeignKey auf Ihr Property-Modell hat. Sehr wahrscheinlich werden Sie einige andere Felder, die zu dem Bild gehören, und nicht zum Immobilien.

3

Ich implementieren Ich mache derzeit ungefähr dasselbe, und ich sah mir das gleiche Problem an.

Nachdem ich eine Weile geforscht habe, entschied ich mich für django-imaging. Es hat eine nette Ajax Funktion, Bilder können auf der gleichen Seite wie die Seite des Modells eingefügt werden und können editierbar sein. Das einzige, was es fehlt, ist die Unterstützung für die Nicht-JPEG-Erweiterung. Ich hoffe, ich werde die Lösung dafür in Tagen haben. :)