0

Ich studiere CBV in Django. Ich möchte, dass ein Benutzer Bilder auf eine bestimmte Karte einer Wohnung hochladen kann. So wurde das Modell erstellt:Django. Erhalte die ID des ForeignKey-Objekts in CreateView

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) 

Die ersten Daten des Formulars sind photo_user und die photo_flat. Wenn ich versuche, ein oder mehrere Bilder über ein Formular auf der Seite zu speichern, habe ich AttributeError.

'NoneType' object has no attribute 'pk' 

Meine Modelform sieht wie folgt aus:

class PhotoUploadModelForm(forms.ModelForm): 

    class Meta: 
     model = Photo 
     fields = ['photo_path','photo_user','photo_flat','photo_description' 

Mein Create:

class PhotoUploadView(CreateView): 
    form_class = PhotoUploadModelForm 
    def get_initial(self): 
     return {'photo_user': self.request.user, 
       'photo_flat': self.object.pk 
       } 
    def get_success_url(self): 
     return reverse('ha:flatdetail') 

und meine urls.py

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

ich den Fehler zu verstehen hat, aber nicht genug Fähigkeiten, damit umzugehen. bin ich richtig, dass self.object.pk wäre die ID des Bildes, aber nicht die Wohnung? Kann ich die ID der Wohnung bekommen?

+0

@Pythonista, ich denke, dass ich versuche etwas Dummes zu tun, Wenn ich flat.id zu 'photo_flat' übergeben will, sollte ich' flat = get_object_or_404 (Flat) 'in' def get_initial (self) 'einschließen? Aber es gibt eine ganze Liste von Wohnungen zurück, die ich habe. Wie kann ich bestimmte ID weitergeben? Wie folgt: 'flat = get_object_or_404 (Flat, pk = flat_id)'? Aber es funktioniert nicht, weil 'get_initial' nicht' flat_id' hat –

Antwort

2

Sie interpretieren den Fehler falsch, aber das liegt zum Teil daran, dass das, was Sie tun, nicht sehr sinnvoll ist.

self.object kann sich nur auf das Objekt beziehen, das diese Ansicht betrifft, in diesem Fall ist das Foto; aber natürlich existiert dieses Foto noch nicht, wenn Sie get_initial machen, weil es nicht erstellt wurde. Anscheinend möchten Sie die ID eines bestimmten Flat-Objekts verwenden. In diesem Fall müssten Sie diese ID an die Ansicht übergeben, dh über die URL. Sie tun dies bereits in Ihrer flat_ajax Ansicht; Sie sollten genau dasselbe hier tun, und dann können Sie die ID über self.kwargs['flat_id'] referenzieren.

Beachten Sie, dass get_initial ist nicht wirklich der beste Ort, um dies zu tun, wie auch immer. Das Benutzer- und das Flat-Objekt sind keine Werte, die an das Formular übergeben werden sollen, sodass sie zunächst Felder ausfüllen, sie aber vom Benutzer geändert werden können. Sie sind Werte, die beim Speichern automatisch mit dem Objekt verknüpft werden sollen. Also, sollte dies wirklich in form_valid erfolgen, wie in the documentation gezeigt:

def form_valid(self, form): 
    form.instance.photo_user = self.request.user 
    form.instance.photo_flat_id = self.kwargs['flat_id'] 
    return super(PhotoUploadView, self).form_valid(form) 

Wenn Sie es auf diese Weise tun, Sie photo_user und photo_flat von den Feldern in Form aufgeführt entfernen sollten.