2017-04-03 3 views
0

Ich möchte ein Modell, das den Benutzer in der Wagtail-Admin-Site zu wählen, ein Verzeichnis von Bildern geben geben Sie den Namen der Sammlung in einem CharField und auf einen Knopf drücken Sie eine Sammlung mit den gegebenen Name würde erstellt werden, dann die Bilder aus einem gegebenen Verzeichnis würden dann in der Datenbank gespeichert werden (damit sie im CMS verfügbar sind). Der Titel des Bildes wäre der Dateiname, während das Tag der Name des Verzeichnisses ist, in dem das Bild gefunden wird.Erstelle Sammlung mit Python-Code

Ich fand einen anderen Beitrag darüber, wie Bilder in der Datenbank mit Code gespeichert werden (image saving) , aber ich habe ein Problem beim Erstellen von Sammlungen programmatisch. Ich fand hier, um diesen Code (from here) funktionieren sollte, aber für mich anscheinend ist es nicht, wenn ich manage.py makemigrations tun, bekomme ich diesen Fehler:

django.db.utils.IntegrityError: UNIQUE constraint failed: wagtailcore_collection.path 

Muss ich den Pfad in add_child zur Verfügung stellen müssen? Welchen Weg soll es sein? Danke für jede Hilfe im Voraus!

root_coll = Collection.get_first_root_node() 
root_coll.add_child(name='testcoll') 
+0

Bitte können Sie die vollständige Stack-Trace des IntegrityError zeigen? Ich bin ein wenig verwirrt, warum das auf dem 'makemigrations'-Schritt geschehen würde ... – gasman

+0

Die vollständige Fehlermeldung [link] (https://github.com/lazmol/wagtail-imageloader) finden Sie in err_trace.log. Die model.py ist da, beachten Sie, dass ich wirklich neu in Wagtail bin, also ist jede Hilfe willkommen! – Lazlo

+0

Nur eine codierungsbezogene Frage: Wie funktioniert es, dass ein Image-Objekt wie folgt instanziiert werden kann: Image (title = "Bildtitel", file = ImageFile (image_file, name = "image-filename.jpg"))? Wenn ich mir [die Klassendefinition] (https://github.com/wagtail/wagtail/blob/master/wagtail/wagtailimages/models.py) anschaue, sehe ich keine __init__ Methode, aber diese (Titel, Datei) sind Klassenvariablen der AbstractImage-Klasse, die von Image geerbt wird. Wie kommt es, dass Sie diese als Argumente verwenden können, wenn Sie Image instanziieren und warum gibt es kein __init__? – Lazlo

Antwort

1

Das Problem ist, dass Sie den Code direkt in der Definition von GalleryPage laufen:

class GalleryPage(Page): 
    # test 
    root_coll = Collection.get_first_root_node() 
    root_coll.add_child(name='testcoll') 

Dies wird jedes Mal models.py geladen laufen - und insbesondere die ./manage.py makemigrations und ./manage.py migrate Befehle benötigen laden Sie models.py, um herauszufinden, wie Sie Ihre Datenbank einrichten. Das Erstellen von Datenbankobjekten scheitert natürlich an diesem Punkt, weil die Datenbank noch nicht fertig ist ...

Der beste Ort, um Testcode wie diesen auszuführen, ist wahrscheinlich die ./manage.py shell Befehlszeile, wo Sie laufen können sollten die folgenden Zeilen erfolgreich:

from wagtail.wagtailcore.models import Collection 
root_coll = Collection.get_first_root_node() 
root_coll.add_child(name='testcoll') 
Verwandte Themen