【问题标题】:How to use Httprequest object in FormView?如何在 FormView 中使用 Httprequest 对象?
【发布时间】:2020-05-06 17:08:06
【问题描述】:

我在基于类的视图中转换以下函数视图: 但问题是下面的登录代码使用了请求对象。那么如何在表单视图中使用这个请求。

我想更改为基于类的视图的功能视图:


def login(request):
    if request.method == 'GET':
        form = UserLoginForm()


    elif request.method == 'POST':
        form = UserLoginForm(request.POST)
        if form.is_valid():
            username = form.cleaned_data.get('name')
            password = form.cleaned_data.get('password')
            user = User.objects.filter(name=username, password=password).first()
            if user is not None:
                request.session['user'] = username
                return redirect('index')

            else:
                messages.error(request, 'Username or password no matched')


    return render(request, 'products_app/login.html', {'form': form})

上面代码的基于 FormView/class 的视图我更改为给出错误:

class Login(FormView):
    template_name = 'products_app/login.html'
    form_class = UserLoginForm
    success_url = reverse_lazy('index')

    def form_valid(self, form):
            username = form.cleaned_data.get('name')
            password = form.cleaned_data.get('password')
            user = User.objects.filter(name=username, password=password).first()
            if user is not None:
                request.session['user'] = username
            else:
                messages.error(request, 'Username or password no matched')
            super().form_valid(form)

这里的问题是,与上面 def login(request) 的功能视图不同,没有收到请求。所以给出错误:

module 'django.http.request' has no attribute 'session'

【问题讨论】:

  • 你启用会话中间件了吗?
  • @WillemVanOnsem 是的,我在 installed_apps 中列出了“django.contrib.sessions”。

标签: django django-models django-rest-framework django-forms django-views


【解决方案1】:

问题是您正在使用错误中所述的request 模块。您真正想要的是调用该类的请求实例。你的代码应该是self.request

我已经删除了所有多余的代码,只显示带有request 的部分。

class Login(FormView):
    ...

    def form_valid(self, form):
            ...
            if user is not None:
                self.request.session['user'] = username
            else:
                messages.error(self.request, 'Username or password no matched')
            ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-22
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多