2017-07-02 9 views
3

フルトレースバックcleaned_dataを使用する場合、 "TypeError:文字列インデックスが整数である必要があります"を修正する方法?

response = wrapped_callback(request, *callback_args, **callback_kwargs) File "C:\Users\P.A.N.D.E.M.I.C\Desktop\td11\newstudio\accounts\views.py", line 129, in reset_activation_key email = form.cleaned_data['email'] TypeError: string indices must be integers

これはエラーがアップ

def reset_activation_key(request): 
    if request.user.is_authenticated(): 
     return redirect('/accounts/logout') 
    if request.method == "POST": 
     form     = ResetActivatioKey(request.POST or None) 
     if form.is_valid(): 
      email    = form.cleaned_data['email'] 
      user    = User.objects.get(email=email) 
      profile    = UserProfile.objects.get(user=user) 
      if profile.is_active: 
       return redirect('/accounts/login') 
      if profile is not None and not profile.is_active == False : 
       username  = user.username 
       email_path  = "{0}/ResendEmail.txt".format(settings.EMAIL_FILE_PATH) 
       get_secret_key = activation_key_generator(username) 
       profile.activation_key = get_secret_key 
       profile.key_expires = (timezone.now() + datetime.timedelta(days=2)), 
       profile.save() 

       send_some_email(email, username, get_secret_key) 
      return redirect('/accounts/login') 
    else: 
     form = ResetActivatioKey() 
     context = {"form":form} 
    return render(request, 'accounts/registration/reset_activation_key.html', context) 

フォーム

class ResetActivatioKey(forms.Form): 
    email = forms.EmailField(widget=forms.TextInput(attrs=dict(required=True, max_length=30)), label=_("Email address")) 

    def clean(self): 
     try: 
      user = User.objects.get(email__iexact=self.cleaned_data['email']) 
      return self.cleaned_data['email'] 
     except: 
      raise forms.ValidationError('User with that email does not exist!') 
+0

あなたはResetActivatioKeyフォームを示すことができ、自分のフォームでごclean()方法を編集する必要があります?また、全体のビューを投稿してください...それから抜粋だけではありません。 – zaidfazil

+0

完了、すべてが追加されます! –

答えて

3

Cleandictを返す必要が吹く図です。

def clean(self): 
     cleaned_data = super(ResetActivatioKey, self).clean() 
     try: 
      user = User.objects.get(email__iexact=self.cleaned_data['email']) 
      return cleaned_data 
     except: 
      raise forms.ValidationError('User with this email does not exist!')  
3

あなたclean()方法は、あなたがそれに入力した電子メールの文字列を返している:あなたはcleanメソッドを書き換える必要があります。方法でsuper()に電話すると、cleaned_dataをdictとして取得し、ビューに返す必要があります。

あなたは

def clean(self): 
    cleaned_data = super(ResetActvatioKey, self).clean() 
    try: 
     user = User.objects.get(email__iexact=self.cleaned_data['email']) 
     return cleaned_data 
    except: 
     raise forms.ValidationError('User with that email does not exist!') 
関連する問題