2016-05-21 10 views
4

Ich lerne das CBV in Django.Django Createview Formular speichern und auf Seite entsprechend der ID des Fremdschlüssels umleiten

Ich habe eine Seite von Flat. Ich möchte, dass ein Benutzer einige Bilder der Wohnung auf dieser Seite hinzufügen kann.

Die Fotos der Wohnung sind im Modell gespeichert und mit den Modellen User und Flat verbunden. Mein Modell sieht wie folgt aus:

class Photo(models.Model): 
    photo_path = models.ImageField(verbose_name='Фотография') 
    photo_user = models.ForeignKey(User, verbose_name='Агент, добавивший фото') 
    photo_flat = models.ForeignKey(Flat, verbose_name='Квартира') 
    photo_description = models.CharField(verbose_name='Описание', max_length=200, null=True, blank=True) 

Mein Ziel: Wenn ein Benutzer einige Bilder hinzufügt und den Knopf drückt, werden die Bilder auf dem Modell gespeichert werden. Der Benutzer wird dann zur gleichen Detailansicht der Wohnung umgeleitet und sieht ihre hinzugefügten Bilder.

Ich habe verschiedene Optionen ausprobiert, aber ich habe nicht genug Fähigkeiten, um mit diesem Problem umzugehen.

Das erste, was mich verwirrt, ist die template_name Variable in der CreateView. Mein CreateView sieht so aus:

Was ist, wenn ich dem Benutzer keine andere Seite anzeigen möchte? Ich möchte, dass sie nach dem Posten der Bilder in die gleiche flache Detailansicht umgeleitet werden. Ich kann nicht template_name von CreateView löschen, da der folgende Fehler:

TemplateResponseMixin requires either a definition of 'template_name' or an implementation of 'get_template_names()' 

Was habe ich in der CreateView oben erreicht?

Die zweite verwirrende Sache: Ich postete die Bilder und wurde umgeleitet auf redirect.html, aber nicht die flache Detailansicht. Das ist schlecht. Aber meine Bilder wurden auch nicht gespeichert. Das ist sehr schlecht. Ich habe versucht, redirect.html zu flatdetail.html zu ändern, aber natürlich zeigt es die Seite mit keinen zusätzlichen Informationen wie Zimmer, Größe, Preis und so.

Was soll ich tun, zwei Dinge in dieser besonderen Situation zu erreichen:

  1. speichern die Daten

  2. Leiten Sie den Benutzer auf die flache Detailansicht nach ein paar Fotos hinzufügen.

Zusätzliche Informationen: meine urls.py

url(r'^dev/flat/(?P<flat_id>[0-9]+)/$', views_dev.flat_ajax, name='flatdetail'), 
url(r'^dev/photo-update/(?P<flat_id>[0-9]+)/$', views_dev.PhotoUploadView.as_view(), name='image-update') 

mein forms.py

class PhotoUploadModelForm(forms.ModelForm): 
    class Meta: 
     model = Photo 
     fields = ['photo_path'] 

Meine Form in der flatdetail Vorlage:

<form action="/dev/photo-update/{{flat.id}}/" method="POST"> 
{% csrf_token%} 
    <input type="file" multiple> 
    <button>Send</button> 
</form> 
+1

Da Sie den Code aus meiner Antwort zu Ihrer vorherigen Frage verwendet haben, sollten Sie diese Antwort akzeptieren. –

+0

Haben Sie Erfolg, oder brauchen Sie mehr Hilfe? Wenn meine Antwort "die Antwort" wäre, würde es Ihnen etwas ausmachen, sie anzunehmen? – Bono

Antwort

4

Ich denke, du machst gerade zwei Dinge durcheinander.

Ihr PhotoUploadView ist komplett von Ihrer flachen Detailansicht getrennt. Die template_name Variable in der PhotoUploadView ist die Vorlage, die beim Laden der Upload-Seite verwendet wird.Dies sollte also auf den HTML-Code verweisen, den Sie für den Datei-Upload verwenden möchten.

template_name = 'flat_upload_photo.html' 

Ich bin Ihre aktuelle get_success_url() Funktion zu bemerken ist nicht richtig eingezogen. Dies könnte dazu führen, dass die Funktion nicht innerhalb der Klasse erkannt wird und somit nicht verwendet wird. Ich bin nicht sicher, ob dies nur ein Einrückungsfehler in StackOverflow oder auch in Ihrem tatsächlichen Code ist. Ich sehe auch, dass die Funktion nicht die richtigen Argumente für eine Umleitung hat. Wenn wir Ihre urls.py betrachten, sehen wir, dass die URL für flatdetail eine flache ID erfordert. So stellen Sie sicher, dass Ihre get_success_url() Einbuchtungen korrekt (innerhalb der Klasse) und sieht wie folgt aus:

def get_success_url(): 
    return reverse('flatdetail', args=(self.kwargs['flat_id'],) 

args=(self.kwargs['flat_id'],) stellt sicher, dass wir ein Tupel mit den Argumenten der URL übergeben, für die wir suchen. Insbesondere die ID des Objekts, zu dem wir zurückkehren möchten. Dies ist erforderlich, da die URL flatdetail, die Sie in urls.py angegeben haben, eine flache ID erfordert.

Drittens glaube ich, dass der Grund, warum Ihre PhotoUploadView kein Foto hochgeladen hat, damit zu tun hat, dass Sie auf self.instance.photo_user statt form.instance.photo_user zugreifen. Es ist auch nicht notwendig, form.save() an diesem Punkt zu tun, da dies passieren wird, wenn Sie die super() Funktion aufrufen.

Ich bin mir nicht ganz sicher, was in Ihrem form_valid() vor sich geht. Vielleicht, wenn Sie erklären könnten, was dort schief läuft (irgendwelche Fehler?), Wäre ich in der Lage, Ihnen besser zu helfen.

+0

Danke für Hilfe. Wenn ich die Funktion in die Anweisung 'success_url = reverse ('flatdetail') ändere' 'habe ich einen Fehler' Die enthaltene URLconf 'django_project.urls' scheint keine Muster zu enthalten. Wenn Sie gültige Muster in der Datei sehen, wird das Problem wahrscheinlich durch einen kreisförmigen Import verursacht. Der Fehler tritt auf, wenn ich versuche, die Seite der Wohnung zu laden. Ich ändere die Funktion zu "reverse_lazy" und jetzt bin ich mit dem gleichen Fehler beim Versuch, die Bilder –

+0

Mit "reverse_lazy" der Fehler ist eigentlich weg, aber ich habe keine Umleitung zurück auf die Seite der Wohnung. Django rendert 'redirect.html', was eine leere Seite ist und zeigt sie an. Fotos werden auch nicht gespeichert. Ich kann keine Fehler sehen –

+0

@ mailman_73 Ich habe meine Antwort aktualisiert. Ich habe mich wirklich geirrt, die Variable 'success_url' zu verwenden. Haben Sie die Werte in 'form_valid()' mit den richtigen 'form.instance.photo_user' Werten aktualisiert? – Bono