2017-04-12 55 views
0

我想检查用户是否从我的views.py文件登录。取决于如果用户登录它应该返回我不同的形式。但request.user.is_authenticated()或request.user.is_authenticated不起作用,我总是得到真正的价值。如何在views.py中request.user.is_authenticated()? Django

我的观点:

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 + ' ', 
       ['[email protected]'], 
       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, 
     }) 

而且我的两个形式:

class ContactForm_logged(forms.Form): 
    contact_name = forms.CharField(required=True) 
    contact_email = forms.EmailField(required=True) 
    subjects = forms.ChoiceField(choices=emailsubjects) 
    content = forms.CharField(
     required=True, 
     widget=forms.Textarea 
    ) 

    def __init__(self, *args, **kwargs): 
     self.request = kwargs.pop("request") 
     super(ContactForm_logged, self).__init__(*args, **kwargs) 
     self.fields['contact_name'].label = "Your name:" 

     if (self.request.user.first_name == '' or self.request.user.last_name ==''): 
      self.fields['contact_name'].initial = 'Type your name here' 
      self.fields['contact_name'].widget.attrs['readonly'] = False 
     else: 
      self.fields['contact_name'].initial = self.request.user.first_name 
      self.fields['contact_name'].widget.attrs['readonly'] = True 

     self.fields['contact_email'].label = "Your email:" 

     if (self.request.user.profile.sdu_email == ''): 
      if (self.request.user.email == ''): 
       self.fields['contact_email'].initial = 'Type your email here' 
       self.fields['contact_email'].widget.attrs['readonly'] = False 
      else: 
       self.fields['contact_email'].initial = self.request.user.email 
       self.fields['contact_email'].widget.attrs['readonly'] = True 
     else: 
      self.fields['contact_email'].initial = self.request.user.profile.sdu_email 
      self.fields['contact_email'].widget.attrs['readonly'] = True 

     self.fields['content'].label = "What do you want to say?" 
     self.fields['content'].initial = "Dear, Smart 3D printing facility team, I like this WEB server very much, but ..." 

     self.fields['subjects'].label = "Please, select the subject of your message" 


class ContactForm_nonlogged(forms.Form): 
    contact_name = forms.CharField(required=True) 
    contact_email = forms.EmailField(required=True) 
    subjects = forms.ChoiceField(choices=emailsubjects) 
    content = forms.CharField(
     required=True, 
     widget=forms.Textarea 
    ) 

    def __init__(self, *args, **kwargs): 
     self.request = kwargs.pop("request") 
     super(ContactForm_nonlogged, self).__init__(*args, **kwargs) 
     self.fields['contact_name'].label = "Your name:" 

     self.fields['contact_name'].initial = 'Type your name here' 

     self.fields['contact_email'].label = "Your email:" 

     self.fields['contact_email'].initial = 'Type your email here' 

     self.fields['content'].label = "What do you want to say?" 
     self.fields['content'].initial = "Dear, Smart 3D printing facility team, I like this WEB server very much, but ..." 

     self.fields['subjects'].label = "Please, select the subject of your message" 

的问题是,是否我登录或我不是我总是得到ContactForm_logged形式回来。如果我没有登录比得到ContactForm_logged表单回来我得到一个错误,“AnonymousUser”对象没有属性'first_name'“。 我在论坛上看到,如果我调用request.user.is_authenticated()错误,但我已经尝试request.user.is_authenticated()和request.user.is_authenticated,都给我同样的错误:/

任何帮助将不胜感激!

+0

注意你应该使用'返回渲染(请求,“threeD/contacts.html ',{'form':form})'在你的视图中。如果您使用表单* class *,那么您将在模板中获得一个空白表单,因此错误将不会显示。 – Alasdair

回答

1

问题是,在你看来方法定义的第一行:

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

在这里你正在创建一个ContactForm_logged类的实例。每当调用view方法时,这行都会被执行。因此,无论用户是否登录,每次都会创建一个ContactForm_logged类的实例。此外,在您访问self.request.user.first_nameContactForm_logged课程的__init__方法中。因此,当ContactForm_logged实例正在为未认证的请求初始化它是提高错误:“‘AnonymousUser’对象有没有属性‘FIRST_NAME’

+0

好景点!前两行应完全删除。它们只用于'return render()'行,正如我在上面的注释中所说的,你应该在那里使用'form',而不是类。如果你稍后在你的代码中使用'form = form_class(...)'而不是'ContactForm_logged(...)'和'ContactForm_nonlogged(...)'来使用'form_class' )'。如果您更改nonlogged表单以接受'request',或者将表单kwargs设置为单独的步骤,则只能执行此操作。 – Alasdair

+0

太棒了,谢谢Ishan!我已经添加了一个额外的if语句在我的视图的开头,如: 如果request.user.is_authenticated(): form_class = ContactForm_logged(请求=请求) 其他: form_class = ContactForm_nonlogged(请求=请求) 和我正在返回form_class。现在它起作用了。谢谢,伙计们,寻求帮助! –

+1

欧,现在我看到我的问题...谢谢你,@Alasdair。我已经完全删除了前两行,并将我的回归更改为'form':form,正如你上面所建议的,它仍然可以完美运行 –

0

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

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

如果您使用的是正确的版本,它返回True,那么建议你真的登录

+0

谢谢你,阿拉斯代尔,为你的答案。我使用的是Django 1.9版本,在我的视图代码中我有request.user.is_authenticated(),但它仍然不起作用。它始终返回True。我确定我没有登录,因为在我的基础模板中,我正在使用{%if user.is_authenticated%} ... {%endif%}更改导航栏,并且它没有被更改(所以我确定我是没有登录),然后我访问ContactsView,并从我的request.user.is_authenticated(),总是得到真正的,这导致错误:/ –

+0

如果'request.user.is_authenticated()'是真的,那么我真的认为你已经登录如果导航栏显示你没有登录,那么这可能是导航条码中的一个错误。 – Alasdair

+0

如果request.user.is_authenticated()为true,那么你确实已经登录了。正如Ishan在他的回答中所说的,错误可能来自'form_class_nonlogged = ContactForm_nonlogged(request = request)',而不是来自'if request'内部。 user.is_authenticated():'if语句。您可以自己调试,通过添加打印语句或查看回溯。 – Alasdair

相关问题