使用 formwizard-django 创建用户后登录

Posted

技术标签:

【中文标题】使用 formwizard-django 创建用户后登录【英文标题】:Login after creating a user with formwizard-django 【发布时间】:2013-11-23 20:51:44 【问题描述】:

我想在创建用户后登录。但是我正在使用 formwizard,当我尝试时出现错误“未定义全局名称'请求'”。

这是我的观点.py

class ProfilWizard(SessionWizardView):
template_name = "gestionProfil/profil-step1.html"
def done(self, form_list, **kwargs):
    form_data = process_form_data(form_list)
        return render_to_response('gestionProfil/profil.html', 'form_data': form_data)

def process_form_data(form_list):
    form_data = [form.cleaned_data for form in form_list]
    username = form_data[0]['username']
    password = form_data[0]['password']
    email = form_data[0]['email']
    user = User.objects.create_user(username, email, password)
    user.first_name = form_data[1]['firstName']
    user.last_name = form_data[1]['lastName']
    user.save()

user = authenticate(username = username, password = password)
if user:
    login(request, user)
return form_data

那么创建用户后我应该如何登录呢?

编辑: 在进行 user777466 建议的编辑后,我的 views.py 现在是:

class ProfilWizard(SessionWizardView):
template_name = "gestionProfil/profil-step1.html"
def done(self, form_list, **kwargs):
    (form_data,user) = process_form_data(form_list)
    user.backend = 'django.contrib.auth.backends.ModelBackend'
    if user:
        login(self.request, user)
        #return HttpResponse(form_data[0]['password'])
        return render_to_response('gestionProfil/profil.html', 'form_data': form_data)

def process_form_data(form_list):
    form_data = [form.cleaned_data for form in form_list]
    username = form_data[0]['username']
    password = form_data[0]['password']
    email = form_data[0]['email']
    user = User.objects.create_user(username, email, password)
    user.first_name = form_data[1]['firstName']
    user.last_name = form_data[1]['lastName']
    user.save()

    return (form_data,user)

表格期间和之后的输出是:

[2013 年 11 月 13 日 08:39:12]“GET /gestionProfil/createNew/HTTP/1.1”200 4639

[2013 年 11 月 13 日 08:39:22]“POST /gestionProfil/createNew/HTTP/1.1”200 5085

[2013 年 11 月 13 日 08:39:40]“POST /gestionProfil/createNew/HTTP/1.1”200 4601

[2013 年 11 月 13 日 08:39:40] “获取 /captcha/image/c9adfbd5b6984ed094fdc7c4607acfb4d915d037/HTTP/1.1" 200 4611

/usr/local/lib/python2.7/dist-packages/django/db/models/fields/init.py:827: RuntimeWarning: DateTimeField 收到一个天真的日期时间 (2013-11-13 08:39:45.847325) 时区支持处于活动状态。运行时警告)

/usr/local/lib/python2.7/dist-packages/django/db/models/fields/init.py:827: RuntimeWarning: DateTimeField 收到一个天真的日期时间 (2013-11-13 08:39:45.864404) 时区支持处于活动状态。运行时警告)

[2013 年 11 月 13 日 08:39:47]“POST /gestionProfil/createNew/HTTP/1.1”200 3704

编辑 2: 我已经删除了我的数据库并创建了一个新的同步数据库,现在身份验证正在运行。

【问题讨论】:

【参考方案1】:

您的请求未通过 process_form_data 方法。

解决方案 1 - 在 process_form_data 方法中记录用户:

form_data = process_form_data(self.request, form_list)
def process_form_data(request, form_list)
  ...

解决方案 2 - 在 done 方法中登录用户:

class ProfilWizard(SessionWizardView):
  template_name = "gestionProfil/profil-step1.html"
  def done(self, form_list, **kwargs):
      form_data = process_form_data(form_list)
      user = authenticate(username = form_data[0]['username'], password = form_data[0]['password'])
      if user:
         login(self.request, user)
        return render_to_response('gestionProfil/profil.html', 'form_data': form_data)

  def process_form_data(form_list):
    form_data = [form.cleaned_data for form in form_list]
    username = form_data[0]['username']
    password = form_data[0]['password']
    email = form_data[0]['email']
    user = User.objects.create_user(username, email, password)
    user.first_name = form_data[1]['firstName']
    user.last_name = form_data[1]['lastName']
    user.save()
    return form_data

最近,由于密码字段,我的 authenticate() 无法处理项目。在这种情况下,做一个简单的:

user.backend = 'django.contrib.auth.backends.ModelBackend'
login(request, user)

所以你应该有类似的东西:

class ProfilWizard(SessionWizardView):
  template_name = "gestionProfil/profil-step1.html"
  def done(self, form_list, **kwargs):
      form_data = process_form_data(self.request, form_list)         
      return render_to_response('gestionProfil/profil.html', 'form_data': form_data)

  def process_form_data(self, request, form_list):
    form_data = [form.cleaned_data for form in form_list]
    username = form_data[0]['username']
    password = form_data[0]['password']
    email = form_data[0]['email']
    user = User.objects.create_user(username, email, password)
    user.first_name = form_data[1]['firstName']
    user.last_name = form_data[1]['lastName']
    user.save()
    user.backend = 'django.contrib.auth.backends.ModelBackend'
    login(request, user)
    return form_data

【讨论】:

谢谢,修改代码后错误消失。但是,它不起作用。创建配置文件后,它们仍然没有连接。就像身份验证不起作用一样。 可以打印form_data[0]['password']吗? 我已经尝试过编辑,但它仍然不起作用。当我打印 form_data[0]['password'] 时,我得到的正是我写的密码,而不是哈希密码。 你能给出一些调试输出吗?也许尝试在 done() 方法中执行 user.backend="",这可能是请求未正确传递。 我已经在 done() 中尝试了 user.backend=""。它不会改变任何东西。我在输出中有一个警告:RuntimeWarning: DateTimeField received a naive datetime

以上是关于使用 formwizard-django 创建用户后登录的主要内容,如果未能解决你的问题,请参考以下文章

使用 Passport 创建用户

使用 Django-rest-auth 创建新用户时创建自定义用户模型

Linux Debian11创建新用户和删除用户

Linux Debian11创建新用户和删除用户

Linux Debian11创建新用户和删除用户

为仅使用 ssh 密钥的用户创建密码