2017-10-24 2 views
0

Ich versuche Verwendung Django integrierte Klasse UpdateView ein Bild Modellreverse() bekam ein unerwartetes Stichwort Argument 'pk_url_kwarg' - UpdateView

Das Modell zu aktualisieren ist:

def get_image_path(instance, filename): 
return '/'.join(['studyoffer_images', instance.study_offer.slug, filename]) 


class UploadStudyOffer(models.Model): 

    study_offer = models.ForeignKey(StudiesOffert, related_name='uploadsstudyoffer') 

    image = models.ImageField(upload_to=get_image_path, verbose_name='Seleccionar imagen') 
    # images folder per object 

    featured = models.BooleanField(default=False, verbose_name='Destacada', 
            help_text='Indica si la imagen aparecera en el carrusel') 
    thumbnail = models.BooleanField(default=False) 

    active = models.BooleanField(default=True, verbose_name='Activa', 
           help_text='Indica si una imagen de oferta esta habilitada o disponible') 

    objects = UploadStudyOfferManager() 

    def __str__(self): 
     return self.study_offer.ad_title 

Die Form dieses Modell:

class StudyOfferImagesUploadForm(forms.ModelForm): 
    class Meta: 
     model = UploadStudyOffer 
     fields = ('image', 'active', 'featured') 

Was ich will, ist jetzt der Benutzer zu ermöglichen, ein Bild zu bearbeiten und kann den Status Bild ändern und ändern (featured, active, thumbnail)

Dann baue ich meine StudyOfferImageUpdateView das Bild zu aktualisieren Attribute:

class StudyOfferImageUpdateView(SuccessMessageMixin, UserProfileDataMixin, LoginRequiredMixin, UpdateView): 
    model = UploadStudyOffer 
    form_class = StudyOfferImagesUploadForm 
    success_url = reverse_lazy("host:edit-study-offer-image", pk_url_kwarg='pk') 
    success_message = "Imagen actualizada" 

    def get_context_data(self, **kwargs): 
     context = super(StudyOfferImageUpdateView, self).get_context_data(**kwargs) 

     user = self.request.user 
     return context 

    def get_object(self): 
     return get_object_or_404(UploadStudyOffer, pk=self.kwargs.get('pk')) 

Die URL dieser Ansicht zuzugreifen, ist:

url(r"^study-offer/edit/images/(?P<pk>\d+)/$", 
     StudyOfferImageUpdateView.as_view(), 
     name='edit-study-offer-image' 
    ), 

Wenn ich mein Bild bearbeiten möchten, die Vorlage dies:

Diese Vorlage wird richtig dargestellt, aber wh en ich den Update Submit-Button drücken, bekomme ich diesen Fehler:

Exception Type: TypeError at /host/study-offer/edit/images/47/ 
Exception Value: reverse() got an unexpected keyword argument 'pk_url_kwarg' 

Dieser Fehler existiert, weil in meinem StudyOfferImageUpdateView Django nicht akzeptieren, die success_url = reverse_lazy("host:edit-study-offer-image", pk_url_kwarg='pk')

ich den pk_url_kwarg='pk' Satz in meinem StudyOfferImageUpdateView

drucken versuchen
q=pk_url_kwarg='pk' 
    print(q) 

Und der Ausgang, wenn ich über den Browser zu meinem StudyOfferImageUpdateView eingeben ist:

# pk string, is not the pk value 
pk 
System check identified no issues (0 silenced). 
October 24, 2017 - 15:58:55 
Django version 1.10.7, using settings 'hostayni.settings.development' 
Starting development server at http://127.0.0.1:8000/ 
Quit the server with CONTROL-C. 
[24/Oct/2017 15:58:57] "GET /host/study-offer/edit/images/47/ HTTP/1.1" 200 8559 

Ich weiß, dass in der get_context_data() Methode der pk_url_kwarg='pk' Satz es funktioniert ist, ich es in der success_url = reverse_lazy("host:edit-study-offer-image", pk_url_kwarg='pk') bin vorbei und eine Zeichenfolge pk und für tis Grund ankommen mein Workflow breaked. Wie kann ich den richtigen Parameter in meinem success_url = reverse_lazy("host:edit-study-offer-image", pk_url_kwarg='pk') übergeben, der ein pk Bild erwartet?

Antwort

2

Wenn Sie zuerst reverse oder reverse_lazy aufrufen, geben Sie die Argumente und Schlüsselwortargumente in args und kwargs an. Sie können pk_url_kwarg='pk' nicht tun, müssen Sie kwargs={'pk_url_kwarg': 'pk'} tun.

immer Sie wollen nicht die Saiten verwenden 'pk_url_kwarg' und 'pk' im kwargs Wörterbuch, möchten Sie die Variablen verwenden self.pk_url_kwarg und self.kwargs['pk'] aus der Ansicht.

Sie können nicht auf diese Variablen zugreifen, wenn Sie success_url festlegen, Sie müssen also stattdessen get_success_url überschreiben.

def get_success_url(self): 
    return reverse("host:edit-study-offer-image", kwargs={self.pk_url_kwarg:self.kwargs['pk']}) 

Da Ihre Ansicht ist nicht für subclassed und angepasst werden, ich glaube nicht, dass Sie pk_url_kwarg überhaupt verwenden müssen. Ich würde den Code durch Hardcoding 'pk' vereinfachen.

def get_success_url(self): 
    return reverse("host:edit-study-offer-image", kwargs={'pk': self.kwargs['pk']}) 

Oder verwenden args statt:

def get_success_url(self): 
    return reverse("host:edit-study-offer-image", args=[self.kwargs['pk']) 
+0

Sie sind die besten django Entwickler ich je gesehen habe Sie alle Fragen beantworten: 0, kann man mich lehren:) –

+0

Richtig, ich war verwirrt über der Schlüsselwort zu verwenden. In der [Classy Class-Based Views-UpdateView] (https://ccbv.co.uk/projects/Django/1.11/django.views.generic.edit/UpdateView/) habe ich mir die 'pk_url_kwarg = 'pk' angesehen Attribut, aber ich verweise nicht auf einen korrekten Weg. Tahnks viel für dich. Mit freundlichen Grüßen D – bgarcial

+0

Die 'pk_url_kwarg'-Option bietet Ihnen mehr Flexibilität bei der Verwendung von klassenbasierten Ansichten, aber die zusätzliche Ebene der Indirektion macht es komplizierter. In diesem Fall würde ich es wahrscheinlich zu 'kwargs = {'pk': self.kwargs ['pk']}' vereinfachen. – Alasdair

Verwandte Themen