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

标签 python django

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

相关文章:

python - Bitbucket/Django - 没有共同的引用文献,也没有指定;什么也不做

python - 尝试 : except: not working

python - 在 pandas 中拆分逗号分隔值的列,但保持顺序

python - cython prange 获取 pyeval_savethread : null tstate 错误

mysql - 如何在外键 django 上返回关系名称

python - 从 Django 发送 websocket 请求

python - 找到错误 CSV : coercing to Unicode: need string or buffer, S3BotoStorageFile

python - '>' 未识别为命令行参数?如何将其作为命令行参数传递?

pythonflask - 在不同的url上提供文件

mysql - 以编程方式识别 Django 多对多链接