2017-10-24 6 views
0

私はDjangoの使用をしようとしていますビルトインクラスUpdateView画像モデルを更新するためにリバース()予期しないキーワード引数「pk_url_kwarg」を得た - UpdateView

をモデルがある:

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 

本の形モデルは次のとおりです。

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

私が今欲しいことは、ユーザーが画像を編集することを可能にすることであり、それを変更し、ステータス画像(featured、を変更することができます0、thumbnail

その後、私は画像を更新するために、私のStudyOfferImageUpdateViewを構築属性:

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')) 

このビューにアクセスするためのURLは次のとおりです。

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

私は私の画像を編集したい場合は、テンプレートがありますthis:

{% block body_content %} 

<h2>Editar imágen</h2> 
<form role="form" action="" method="POST" enctype="multipart/form-data"> 
    {% csrf_token %} 
    {{ form.as_p }} 
      <input type="submit" value="Update" class="submit-button"> 
</form> 
{% endblock %} 

このテンプレートは正しくレンダリングされますが、wh私は私のStudyOfferImageUpdateView

pk_url_kwarg='pk'文を印刷してみてください success_url = reverse_lazy("host:edit-study-offer-image", pk_url_kwarg='pk')

を受け入れていないので、私のStudyOfferImageUpdateViewジャンゴに

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

このエラーは、存在します。私はUpdate送信ボタンを押して途中、私はこのエラーを取得します

q=pk_url_kwarg='pk' 
    print(q) 

ブラウザでStudyOfferImageUpdateViewに入力したときの出力は、

です。
# 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 

は、私はそれが作品だpk_url_kwarg='pk'get_context_data()方法では、私はsuccess_url = reverse_lazy("host:edit-study-offer-image", pk_url_kwarg='pk')にそれを渡していますことを知っていると、文字列pkに到着し、TISの理由で、私のワークフローがbreakedされます。

pkイメージが必要なsuccess_url = reverse_lazy("host:edit-study-offer-image", pk_url_kwarg='pk')に正しいパラメータを渡すにはどうすればよいですか?

答えて

2

reverseまたはreverse_lazyを呼び出すときは、引数とキーワード引数をargskwargsに指定します。 pk_url_kwarg='pk'を実行することはできません。kwargs={'pk_url_kwarg': 'pk'}を実行する必要があります。

あなたはkwargs辞書で文字列'pk_url_kwarg''pk'を使用したくないただし、ビューから変数self.pk_url_kwargself.kwargs['pk']を使用します。

success_urlを設定した場合は、これらの変数にアクセスできないため、代わりにget_success_urlを上書きする必要があります。あなたのビューがサブクラス化し、カスタマイズすることが意図されていないので

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

、私はあなたがすべてでpk_url_kwargを使用する必要はないと思います。 'pk'をハードコーディングしてコードを単純化します。

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

またはその代わりにargsを使用します。

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

あなたは私が今まであなたがすべての質問に答えている見た中で最高のDjangoの開発者である:0、を教えてください。) –

+0

正しい、私は約混乱していました使用するキーワード。 [Classy Class-Based Views-UpdateView](https://ccbv.co.uk/projects/Django/1.11/django.views.generic.edit/UpdateView/)で、私は 'pk_url_kwarg = 'pk''を見ていました私は正しい方法を参照していません。 Tahnksあなたのためにたくさん。よろしくお願いします:D – bgarcial

+0

'pk_url_kwarg'オプションは、クラスベースのビューを使用する際の柔軟性を高めますが、余分なレベルの間接指定はより複雑になります。この場合、おそらく 'kwargs = {'pk':self.kwargs ['pk']}'に単純化します。 – Alasdair

関連する問題