Wie zu verwenden Django ImageField, und warum Sie überhaupt nutzen?

Bis jetzt, ich habe der Speicherung meiner Bild-Dateinamen in CharField und speichern die aktuelle Datei direkt auf S3. Das war eine feine Lösung für meine eigene Nutzung. Ich möchte zu überdenken, mit einem ImageField, denn jetzt wird es anderen Benutzern und Datei-input-validation-angemessen wäre.

Ich habe ein paar Fragen, die nicht genau beantwortet nach dem Lesen die docs und der source-code für FileField (die, wie es scheint im wesentlichen ImageField minus die Kissen überprüfen und dimension Feld Update-Funktionalität).

1) Warum verwenden Sie ein ImageField überhaupt? Oder eher, warum verwenden Sie ein FileField? Sicher, es ist bequem für eine schnelle und einfache Formen und bequem für das einfügen in Django-templates. Aber gibt es auch erhebliche Gründe, wie zB. Es ist offenbar gesichert gegen exploits und schädliche uploads?

2) schreiben Sie in das Feld Datei? Wenn es richtig ist, dass die Datei gelesen werden kann instance.imagefield (oder ist es instance.imagefield.file?), wenn ich will, zu schreiben, kann ich einfach Folgendes machen?

@receiver(pre_save, sender=Image)
def pre_save_image(sender, instance, *args, **kwargs):
    instance.imagefield = process_image(instance.imagefield)

3) Wie versuchen Sie, das speichern mit bestimmten Dateinamen und versuchen Sie es erneut mit einem neuen Dateinamen, wenn die, die zufällig generierte Dateiname bereits existiert? Zum Beispiel mit meinem code ich jetzt tun, wie kann es getan werden, mit ImageField? Ich möchte es auf der Modell-Ebene, weil wenn ich das Tue wiederholt versucht, an die view-Schicht dann die pre_save Verarbeitung würde wieder laufen, das ist ghetto (obwohl es unwahrscheinlich ist, dass es dann einen zweiten Versuch, der jemals in der Lebenszeit des service).

for i in range(tries):
    try:
        name = generate_random_name()
        media_storage.save(name + '.jpg', ContentFile(final_bytes))
        break
    except:
        pass

4) In der models.py pre_save und post_save Signale und das aktuelle Modell ist save(), wie kann ich feststellen, ob eine Datei kam mit der Anfrage? d.h. ich möchte wissen, ob ein neues Bild für eingehende gespeichert werden soll, oder wenn es kein Bild (einige andere Feld im Objekt wird aktualisiert und das Bild selbst bleibt unverändert).

  • Dies sollte wirklich werden vier verschiedene Fragen, die Sie kennen. Es ist ein Wunder, dass Sie noch nicht angezogen, gute Stimmen! Mein Vorschlag ist, schließen Sie diese Frage jetzt. wenn Sie unzufrieden mit einer der Antworten, die Sie bekommen haben für eine particlar Punkt 1,2,3,4 poste bitte noch eine Frage, die nur mit diesem Punkt. Auf diese Weise erhalten Sie eine bessere spezifischere Antworten und Sie bekommen mehr Fragen, spezifische Fragen.
  • Vielen Dank für Ihre Beratung, Ihre Lösung funktionieren würde. Ich möchte nicht schließen, diese Frage nur noch, wollen immer noch zu hören, wieder von dkarchmer re: hochladen, direkt auf S3
  • Also wo hast du von hier aus gehen?
InformationsquelleAutor dvtan | 2016-05-20
  1. {% endfor %}

    Stellen Sie SICHER, dass Sie konfigurieren Sie die urls richtig zu handhaben das Bild oder das Bild wird nicht funktionieren. Fügen Sie diese an Ihre urls:

    urlpatterns += patterns('',  
            url(r'^media/(?P<path>.*)$', 'django.views.static.serve', {
                'document_root': settings.MEDIA_ROOT,
            }),
       )
Schreibe einen Kommentar