首页 文章

Django,CreateView:将表单参数传递给reverse_lazy

提问于
浏览
0

要在填写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 回答

  • 1

    你没有将它传递给reverse_lazy . 您应该定义 get_success_url 方法,而不是使用 success_url ,它允许您使用所需的任何参数动态创建URL .

    但是,您的代码在这里几乎没有其他问题 . 首先,您不应该尝试基于HTTP_REFERER属性进行所有计算 . 如果您的视图需要一条信息,则应将其作为关键字参数传递到URL中,然后可以使用 self.kwargs 将其放入视图中 . 在你的情况下,你的视图看起来已经有了pk参数;你可以使用 self.kwargs['pk'] .

    鉴于此,您的 get_success_url 方法将如下所示:

    def get_success_url(self):
        return reverse('piece-detail', kwargs={'pk': self.kwargs['pk')})
    

    其次,你的 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 = ... .

  • 0

    这里是重写和工作阶级(使用来自@DanielRoseman的输入):

    class PieceInstanceCreate(LoginRequiredMixin, CreateView):
        model = PieceInstance
        fields = ['version', 'piece_image', 'status']
    
        def form_valid(self, form):
            form.instance.piece = Piece.objects.get(id=self.kwargs['pk'])
            return super(PieceInstanceCreate, self).form_valid(form)
    
        def get_success_url(self):
            return reverse_lazy('piece-detail', kwargs={'pk': self.kwargs['pk']})
    

相关问题