2017-01-15 5 views
0

一般的なDetailViewでモーダルフォームを作成しようとしていますが、その特定のオブジェクトに関連するエラーをユーザに知らせることができます。フォームが送信されると、ユーザーは同じページ(同じDetailView)に戻ることになっていますが、主キーをFormViewのsuccess_urlに渡す方法がわかりません。Django:DetailView pkをFormViewに渡す

views.py

class ErrorView(AjaxTemplateMixin, FormView): 
    form_class = ErrorForm 
    template_name = 'app/error.html' 

    def get_success_url(self, **kwargs): 
     return reverse_lazy('feriehus_detail', kwargs={'pk': self.object.pk}) 

    def form_valid(self, form): 
     form_content = form.cleaned_data['content'] 

     template = get_template('error_template.txt') 
     context = Context({ 
      'form_content': form_content 
     }) 
     content = template.render(context) 

     email = EmailMessage(
      'Fejl', 
      content, 
      'Your website ' + '', 
      ['[email protected]'] 
     ) 
     email.send() 
     return super(ErrorView, self).form_valid(form) 

class FeriehusDetail(DetailView): 
    model = Feriehus 

    def get_context_data(self, **kwargs): 
     context = super(FeriehusDetail, self).get_context_data(**kwargs) 
     context['price_data'] = CreateContext.price_time_serie(pk=self.kwargs['pk']) 
     return context 

urls.py

url(r'^error/$', views.ErrorView.as_view(), name='error'), 
url(r'^feriehus/(?P<pk>[0-9]+)/$', views.FeriehusDetail.as_view(), name='feriehus_detail'), 

この部分が機能していない:これはちょうどフォーム図であるので、 kwargs={'pk': self.object.pk})

+0

まず第一に、ビューではなくフォームであるため、views.pyに含める必要があります。しかし、オブジェクトを定義するものはまったくありません。オブジェクト、フォームだけを知っているビューから継承しません。フォームを保存してオブジェクトを作成するには、form_validで何もしないでください。だから私はあなたが何を意味するかわからない。 –

+0

ありがとう!それはタイプミスでした。今修正されました。フォームは ' Fejl i data?'を使用してdetailviewテンプレートに挿入されます。detailviewはオブジェクトを記述しており、success_urlを同じページに戻したいと考えています。私はそれが今より意味をなさないことを望む。 – Wessi

答えて

3

は何FormView.object変数はありません。ビューはフォームについてのものであり、単一のオブジェクトの操作に関するものではありません。

何とかそのビューにpkを渡す必要があります。

  1. は、URLでこれを行うことができます。

    url(r'^feriehus/(?P<pk>[0-9]+)/error/$', views.ErrorView.as_view(), name='error') 
    

    get_success_url:

    def get_success_url(self, **kwargs): 
        return reverse_lazy('feriehus_detail', kwargs={'pk': self.kwargs['pk']}) 
    
  2. それとも、URLのクエリコンポーネントでpkを渡すことができますので、URLは次のようになりますこれはerror/?pk=111です。

    get_success_url:

    def get_success_url(self, **kwargs): 
        return reverse_lazy('feriehus_detail', kwargs={'pk': self.request.GET['pk']}) 
    
  3. 最後に、あなたがbootstrapのようなモーダルフォームを使用して、まったくリダイレ​​クトせずにそれを行うことができます。

関連する問題