gpt4 book ai didi

python - Django,创建 View : pass form argument to reverse_lazy

转载 作者:行者123 更新时间:2023-12-05 08:41:08 25 4
gpt4 key购买 nike

要在填写 CreateView 表单后重定向用户,我想从表单访问一个参数并将其传递给 reverse_lazy 函数。如何在 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')

最佳答案

您不会将其传递给 reverse_lazy。您不应使用 success_url,而应定义 get_success_url 方法,该方法允许您使用所需的任何参数动态创建 URL。

但是,您的代码在这里几乎没有其他问题。首先,您不应该尝试根据 HTTP_REFERER 属性进行所有计算。如果您的 View 需要一条信息,您应该将其作为关键字参数传递到 URL 中,然后您可以使用 self.kwargs 在 View 中获取该信息。在您的情况下,您的 View 似乎已经具有 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; super 方法不会返回带有“piece”键的字典,即使它返回了字典,该方法也必须返回一个字典,而不是一个单独的值,包括所有相关项,如实际的 POST 数据。同样不清楚您要使用此方法做什么;因为您没有指定自定义表单,所以它不需要自定义 kwargs。您应该完全删除此方法。

最后,您不需要在 form_valid 方法中调用 form.save(),即使 commit=False。 CreateView 已经为表单分配了一个实例,因此您只需执行 form.instance.piece = ...

关于python - Django,创建 View : pass form argument to reverse_lazy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52045839/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com