表单无效时,FormView get_context_data 不起作用

Posted

技术标签:

【中文标题】表单无效时,FormView get_context_data 不起作用【英文标题】:FormView get_context_data does not work when form is invalid 【发布时间】:2021-10-23 20:34:28 【问题描述】:

当使用 FormView 类创建视图并使用 get_context_data 在表单旁边的测试 html 页面上显示一些数据时, 当表单无效时收到错误,并且没有检索到上下文数据

在 get_context_data 中

上下文['用户名'] = 数据['用户名'] KeyError: '用户名'

表单失效时抛出Key Error

class TestView(LoginRequiredMixin,FormView):
    form_class = TestForm
    template_name = 'test.html'


    def get_context_data(self, **kwargs):
        context = super(CredentialsView, self).get_context_data(**kwargs)
        if self.request.user.is_authenticated:
            data = TestViewSet.as_view('get': 'list')(self.request).data
            context['username'] = data['username']
            context['firstname'] = data['firstname']
            context['lastname'] = data['lastname']
            
        return context

        
    def form_valid(self, form):
        password = form.cleaned_data['password']
        if form.is_valid():
            return self.query_api(password)
        else:
            return super(TestView, self).form_valid(form)

这是回溯

Traceback(最近一次调用最后一次):文件 "/usr/local/lib/python3.6/dist-packages/django/core/handlers/exception.py", 第 34 行,在内部响应 = get_response(request) 文件中 "/usr/local/lib/python3.6/dist-packages/django/core/handlers/base.py", 第 115 行,在 _get_response 响应 = self.process_exception_by_middleware(e, request) 文件 "/usr/local/lib/python3.6/dist-packages/django/core/handlers/base.py", 第 113 行,在 _get_response response = Wrapped_callback(request, *callback_args, **callback_kwargs) 文件 "/usr/local/lib/python3.6/dist-packages/django/views/generic/base.py", 第 71 行,在视图中返回 self.dispatch(request, *args, **kwargs) 文件 “/usr/local/lib/python3.6/dist-packages/django/contrib/auth/mixins.py”, 第 52 行,在 dispatch return super().dispatch(request, *args, **kwargs)文件“/usr/local/lib/python3.6/dist-packages/django/views/generic/base.py”, 第 97 行,在 dispatch return handler(request, *args, **kwargs) 文件中 “./ssh/views.py”,第 91 行,在 post return self.form_invalid(form, **kwargs) 文件“./ssh/views.py”,第 77 行,在 form_invalid context = self.get_context_data(**kwargs) 文件“./ssh/views.py”,第 97 行,在 get_context_data kwargs['username'] = data['username'] KeyError: '用户名'

在上面的场景中,

表单无效时如何获取上下文数据? 当表单被发送时,我们如何将表单错误发送回 html 页面 无效?

【问题讨论】:

【参考方案1】:

get_context_data 在你的 form_valid 函数之前被调用。

在加载页面时,您尝试获取 data["username"] 的值,但它仍未完成。

基本上: 获取您的视图 -> 调用 get_context_data --> 表单尚未完成

您可以在 post 函数中获取参数。

def post(self, request, *args, **kwargs):
    form = TestForm(request.POST)
    if form.is_valid():
        # Do Stuff
    else:
        # Something else
        return render(ThePageWithTheForm)

【讨论】:

你能详细说明一下吗,当表单无效时,我希望将表单错误发送到 html 页面 您可以覆盖提交表单时触发的 post() 函数。在其请求中,您可以访问 request.BODY,其中包含表单的所有信息。您要查找的用户名就在其中。 我尝试了 post 方法,但它没有使用 form_valid 函数 我建议你添加 `form = request.POST' 并检查 form.is_valid() 是否。 我正在寻找一个使用 formview 类的干净结构,将所有内容放在 post 方法中使其体积庞大

以上是关于表单无效时,FormView get_context_data 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Django:使用 FormView 时可能有多种形式?

将参数传递给FormView Django中的表单

如何在 `FormView.get_success_url()` 中访问表单数据

FormView - 指定在 POST 中发送哪些字段

使用 FormView 和 ModelForm 时如何在模板上获取 non_field_errors

创建自定义控件并将其加载到 FormView