2017-04-12 5 views
0

私はユーザーが私のviews.pyファイルからログインしているかどうかを確認しようとしています。ユーザーがログインしているかどうかに応じて、私は別のフォームを返す必要があります。しかし、request.user.is_authenticated()またはrequest.user.is_authenticatedが動作していない、私は常にTrue値を取得します。views.py.is_authenticated()をviews.pyにリクエストする方法は? 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, 
     }) 

そして、私のフォームの2:

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

(注) '使うべきリターンが要求(レンダリング「『AnonymousUser』オブジェクトが属性『first_nameの』を持っていない」:ContactForm_loggedインスタンスが認証されていない要求のために初期化されているときに、それはエラーを上げています'、{' form ':form}) 'のように見えます。 * class *フォームを使用すると、テンプレートに空白のフォームが表示されるため、エラーは表示されません。 – Alasdair

答えて

1

問題は、ビューのメソッド定義の最初の行にあります。

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

ここでは、ContactForm_loggedクラスのインスタンスを作成しています。この行は、viewメソッドが呼び出されるたびに実行されます。したがって、ユーザーがログインしているかどうかにかかわらず、ContactForm_loggedクラスのインスタンスが毎回作成されます。さらに、__init__メソッドのContactForm_loggedクラスでは、self.request.user.first_nameにアクセスしています。 「threeD/contacts.html

+0

良いスポット!最初の2行は完全に削除する必要があります。それらは 'return render()'の行でのみ使用されています。私が上記のコメントで述べたように、クラスではなく 'form'を使用するべきです。 if/elseの代わりに 'ContactForm_logged(...)'や 'ContactForm_nonlogged(...) 'の代わりに' form = form_class(...) 'を使用すると' form_class'を使うのが理にかかります。 ) '。これは、非ログイン形式を変更して 'request'を受け入れる場合や、kwargs形式を別の手順として設定した場合にのみ可能です。 – Alasdair

+0

素晴らしい、ありがとうIshan!私は同じように、私の見解の先頭にif文の余分を追加しました:request.user.is_authenticated場合 (): form_class = ContactForm_logged(要求=要求) 他: form_class = ContactForm_nonlogged(要求=要求) とform_classを返す。それは今働きます。みんな、助けてくれてありがとう! –

+1

おお、今私の問題を見る...ありがとう、@アラスデア。私は最初の2行を完全に削除し、私のリターンを 'フォーム'に変更しました:フォーム、上記のように、それはまだ完全に動作します –

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

ありがとう、Alasdair、あなたの答えです。私はDjango 1.9のバージョンを使用しています。私のコードではrequest.user.is_authenticated()がありますが、それでも動作しません。私はいつも真実を返します。私の基本テンプレートでは、{%if user.is_authenticated%}を使用してナビゲーションバーを変更しているので、ログインしていないと確信しています... {%endif%}それは変更されていません(私は確信していますログインしていない場合)、私はContactsViewにアクセスしていて、request.user.is_authenticated()から常にTrueを取得しています。これはエラーにつながります:/ –

+0

'request.user.is_authenticated()'がTrueの場合、ナビゲーションバーにログインしていないと表示された場合、ナビゲーションバーコードのバグになる可能性があります。 – Alasdair

+0

リクエストが本当に本当にログインしている場合Ishanは答えているように、エラーはおそらく 'if_要求の中からではなく、' form_class_nonlogged = ContactForm_nonlogged = requestForm_nonlogged(request = request) 'から発生しています。 user.is_authenticated(): 'ifステートメント。 print文を追加するか、トレースバックを見て、これを自分でデバッグすることができます。 – Alasdair

関連する問題