我正在尝试在通用DetailView中创建一个模态表单,用户可以让我知道与该特定对象相关的错误。提交表单时,用户应该返回到同一页面(相同的DetailView),但是我在确定如何将主键传递给FormView的success_url时遇到了问题。
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 ' + '',
['youremail@gmail.com']
)
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 :(得分:3)
没有FormView.object变量,因为这只是一个表单视图。视图是关于表单的,而不是关于单个对象的操作。
你必须以某种方式将pk
传递给该视图。
您可以在网址中执行此操作:
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']})
或者您可以在网址的查询组件中传递pk
,因此网址将如下所示:error/?pk=111
。
get_success_url:
def get_success_url(self, **kwargs):
return reverse_lazy('feriehus_detail', kwargs={'pk': self.request.GET['pk']})
最后,你可以使用像bootstrap这样的模态表单来完成,而不需要任何重定向。