要在填写CreateView表单后重定向用户,我想从表单中访问一个参数并将其传递给reverse_lazy函数 . How can I access the parameters of the form within CreateView ?
我实际上使用我正在寻找的参数将它传递给表单本身( self.request.META.get('HTTP_REFERER').split('/')[-1]
),但似乎无法在reverse_lazy中使用此逻辑 .
get_form_kwargs似乎也没有达到结果:
views.py
class PieceInstanceCreate(LoginRequiredMixin, CreateView):
model = PieceInstance
fields = ['version', 'piece_image', 'status']
def form_valid(self, form):
obj = form.save(commit=False)
obj.piece = Piece.objects.get(id=self.request.META.get('HTTP_REFERER').split('/')[-1])
return super(PieceInstanceCreate, self).form_valid(form)
def get_form_kwargs(self):
kwargs = super(PieceInstanceCreate, self).get_form_kwargs()
return kwargs['piece']
success_url = reverse_lazy('piece-detail', kwargs={'pk': get_form_kwargs(self)})
urls.py
path('piece/<int:pk>', views.PieceDetailView.as_view(), name='piece-detail')
2 回答
你没有将它传递给reverse_lazy . 您应该定义
get_success_url
方法,而不是使用success_url
,它允许您使用所需的任何参数动态创建URL .但是,您的代码在这里几乎没有其他问题 . 首先,您不应该尝试基于HTTP_REFERER属性进行所有计算 . 如果您的视图需要一条信息,则应将其作为关键字参数传递到URL中,然后可以使用
self.kwargs
将其放入视图中 . 在你的情况下,你的视图看起来已经有了pk参数;你可以使用self.kwargs['pk']
.鉴于此,您的
get_success_url
方法将如下所示:其次,你的
get_form_kwargs
方法总会给出一个KeyError;超级方法赢了't return a dictionary with a 144503 key, and even if it did the method must return a dict, not an individual value, including all the relevant items like the actual POST data. Again it'不清楚你要用这种方法做什么;因为你不需要自定义的kwargs . 您应该完全删除此方法 .最后,即使使用commit = False,也不需要在form_valid方法中调用
form.save()
. CreateView已经为表单分配了一个实例,因此您可以执行form.instance.piece = ...
.这里是重写和工作阶级(使用来自@DanielRoseman的输入):