如何在views.py中请求.user.is_authenticated()? Django的

时间:2017-04-12 10:40:19

标签: python django authentication

我正在尝试检查用户是否从我的views.py文件登录。根据用户是否登录,它应该返回不同的表单。但是request.user.is_authenticated()或request.user.is_authenticated不起作用,我总是得到True值。

我的观点:

 body {
    width: 100%;
    margin: auto;
}

.container {
    width: 70%;
    margin: 0 auto;
}

.header {
    background: #6396bc;
    width: 100%;
    top: 0;
    position: fixed;
}
.content {
    margin-top: 200px;
}

我的两个表格:

def ContactsView(request):
    form_class = ContactForm_logged(request=request)
    form_class_nonlogged = ContactForm_nonlogged(request=request)

    # new logic!
    if request.method == 'POST':
        if request.user.is_authenticated():
            form = ContactForm_logged(data=request.POST, request = request)
        else:
            form = ContactForm_nonlogged(data=request.POST)

        if form.is_valid():
            contact_name = request.POST.get(
                'contact_name'
                , '')
            contact_email = request.POST.get(
                'contact_email'
                , '')
            form_content = request.POST.get('content', '')
            subjects = form.cleaned_data['subjects']
            subjects = dict(form.fields['subjects'].choices)[subjects]
            # Email the profile with the
            # contact information
            template = get_template('threeD/email/contact_template.txt')
            context = Context({
                'contact_name': contact_name,
                'subjects': subjects,
                'contact_email': contact_email,
                'form_content': form_content,
            })
            content = template.render(context)

            email = EmailMessage(
                "New message from " + contact_name,
                content,
                "Message - " + subjects + ' ',
                ['smart.3d.printing.facility@gmail.com'],
                headers={'Reply-To': contact_email}
            )
            email.send()
            messages.success(request, "Thank you for your message.")
            return redirect('/index/contacts/')

    else:
        if request.user.is_authenticated():
            form = ContactForm_logged(request=request)
        else:
            form = ContactForm_nonlogged()

    if request.user.is_authenticated():
        return render(request, 'threeD/contacts.html', {
            'form': form_class,
        })
    else:
        return render(request, 'threeD/contacts.html', {
            'form': form_class_nonlogged,
        })

问题是,无论我是登录还是不是我总是得到ContactForm_logged表单。如果我没有登录,那么获取ContactForm_logged表单会出现错误,那就是"' AnonymousUser'对象没有属性' first_name'"。 我在论坛上看到,如果我调用request.user.is_authenticated()错误,可能会发生这种情况,但我已经尝试了request.user.is_authenticated()和request.user.is_authenticated,两者都给了我同样的错误:/

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

如果您使用的是Django 1.10+,则应使用属性request.user.is_authenticated

如果您使用的是Django 1.9或更早版本,则必须使用request.user.is_authenticated()。在Django 1.9或更早版本中使用request.user.is_authenticated是一个错误,可能导致敏感数据泄露,因为它总是被评估为True

如果您使用的是正确的版本且返回True,则表明您确实已登录。

答案 1 :(得分:1)

问题出在视图方法定义的第一行:

def ContactsView(request):
    form_class = ContactForm_logged(request=request)

在这里,您要创建ContactForm_logged类的实例。每次调用view方法时都会执行此行。因此,无论用户是否登录,每次都会创建ContactForm_logged类的实例。此外,在__init__类的ContactForm_logged类中,您正在访问self.request.user.first_name。因此,当为未经身份验证的请求初始化ContactForm_logged实例时,它会引发错误:" ' AnonymousUser'对象没有属性' first_name' "