在django

时间:2015-11-14 23:22:29

标签: python django authentication

我使用django的auth模块在我的网站上处理用户登录,注销和注册。

问题在于,当我注册一个新用户时,我重新定向到另一个URL,然后,由于模型已创建但未自动登录,我需要导航到/ login /并登录在手动。

我希望我的网站能够自动执行此操作。我的意思是:

  • 您点击home.html中的注册按钮。您填写表格并提交。
  • 网站AUTOMATICALLY创建新的用户模型,登录并在用户登录时将您重定向到home.html。

Urls.py看起来像这样:

from django.conf.urls import include, url, patterns
from django.contrib import admin

from django.conf import settings
from django.conf.urls.static import static
from django.contrib.auth import views as auth_views
from django.contrib.auth.forms import UserCreationForm

from browse.views import UserCreate

urlpatterns = patterns('',
    url(r'',include('browse.urls')),
    url(r'^$', 'browse.views.home_page', name='home'),
    url(r'^admin/', include(admin.site.urls)),
    url(r'^login/$', auth_views.login, {'template_name': 'browse/login.html'}),
    url(r'^register/$', UserCreate.as_view(
            template_name='browse/register.html',
            form_class=UserCreationForm,
            success_url='/register/'
    )),
    url(r'^logout/$', 'browse.views.logout_view', name='logout'),
    url(r'^', include('django.contrib.auth.urls')),
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

和views.py看起来像这样:

from django.shortcuts import render, redirect
from django.views.generic.edit import CreateView
from browse.models import Pattern
from django.contrib.auth.models import User
from django.contrib.auth import logout, login



class PatternCreate(CreateView):
    model = Pattern
    fields = ['name','description','license', 'xcheme', 'pictures', 'video']

class UserCreate(CreateView):
    model = User


    def post(self, request):
            return login(request, User.objects.get(username=request.POST['username']))

def home_page(request):
    return render(request, 'browse/home.html')

def pattern_detail(request, pk):
    pattern = Pattern.objects.get(pk=pk)
    return render(request, 'browse/pattern_detail.html', {'pattern': pattern})

def logout_view(request):
    logout(request)
    return redirect('/')

如您所见,当您进行GET / register /时,将呈现注册表单。当我POST到/ register /时,我想要正常执行视图然后添加:

def post(self, request):
        return login(request, User.objects.get(username=request.POST['username']))

但看起来我覆盖了默认视图而不是添加它,因为模型没有保存,因为我收到了这个错误:

例外值:
用户匹配查询不存在。

我该如何解决?

事先非常感谢你。

1 个答案:

答案 0 :(得分:0)

好的,这是一个非常愚蠢的问题。幸运的是,我可以搞清楚:

def post(self, request):
    super(UserCreate, self).post(request)
    login_username = request.POST['username']
    login_password = request.POST['password1']
    created_user = authenticate(username=login_username, password=login_password)

    login(request, created_user)
    return redirect('/')

我所要做的就是调用super()并执行父函数。然后,我的代码执行。