2015-11-07 18 views
2

在HTML頁面填寫註冊表格後,它給出了這樣的錯誤,並使用用戶名和密碼,存儲值:在HTML頁面填寫註冊表格後,它給這個錯誤,並在登錄表單中使用的用戶名和密碼,存儲值登錄表單

TypeError at /login/ argument of type 'NoneType' is not iterable. 

This is the error

models.py:

from django.db import models 
from django.utils.translation import ugettext_lazy as _ 

class signup(models.Model): 
    email = models.EmailField(); 
    full_name = models.CharField(max_length=120) 
    username = models.CharField(_('username'), max_length=20, primary_key = True) 
    department= models.CharField(max_length=20) 
    password = models.CharField(_('password'), max_length=128) 
    pic=models.ImageField(upload_to=None, height_field=None, width_field=None, max_length=100, default='default.png') 
    created= models.DateTimeField(auto_now_add=True, auto_now=False) 
    updated= models.DateTimeField(auto_now_add=False, auto_now=True) 

    def __str__(self): 
     return self.username 

class login(models.Model): 
    username = models.CharField(_('username'), max_length=20) 
    password = models.CharField(_('password'), max_length=128) 
    login= models.DateTimeField(_('last_login'),auto_now_add=False, auto_now=True) 

    def __str__(self): 
     return self.username 

forms.py:

from django import forms 
from .models import signup 
from .models import login 

class loginForm(forms.ModelForm): 
    password=forms.CharField(widget=forms.PasswordInput()) 
    class Meta: 
      model=login 
      fields=['username','password'] 


class SignUpForm(forms.ModelForm): 
    password=forms.CharField(widget=forms.PasswordInput()) 
    class Meta: 
      model=signup 
      fields=['username','full_name', 'email','department','password','pic'] 

views.py:

from django.shortcuts import render 
from .forms import SignUpForm 
from .forms import loginForm 
from django.db import connection 

def home(request): 
    title= 'welcome' 
    form = SignUpForm(data = request.POST or None) 
    print(form.is_valid) 
    if form.is_valid(): 
     instance = form.save(commit=False) 
     instance.save() 
     print(instance) 
     print(instance.email) 
    context = { 
     "title": title, 
     "form": form,   
    }  
    return render(request,"base.html", context) 

def login(request): 
    form = loginForm(data = request.POST or None) 
    if form.is_valid(): 
     instance = form.save(commit=False) 

     username=instance.username 
     password=instance.password 
     row=auth(username,password) 
     if password in row: 
      instance.save() 
      form1=SignUpForm 
      context={ 
       "form":form1, 
       "instance":instance 
      } 
      return render(request, "profile.html", context) 
    title= 'welcome back' 
    context ={ 
     "title":title, 
     "form":form  
    }  
    return render(request, "login.html", context) 

def auth(username,password): 
    cursor = connection.cursor() 
    cursor.execute("SELECT password FROM teacher_signup WHERE username = %s", [username]) 
    row = cursor.fetchone()  
    return row 

當點擊註冊按鈕[如果密碼行:]這條線不知何故被調用。

signup page

+0

_not iterable_聽起來像你試圖用循環的論據之一。嘗試一些調試語句來找出缺少的東西。 – wwkudu

+0

@RohitChopra哪一行? – doniyor

+0

你爲什麼要在這裏做生sql?我沒有看到它在Django的任何需要,除非你需要什麼Django無法做orm – doniyor

回答

3

多失誤的觀點:

def login(request): 
    form = loginForm(request.POST or None) # <-- corrected 
    if form.is_valid(): 
     instance = form.save(commit=False) 
     username = instance.username 
     password = instance.password 
     row = auth(username,password) 
     if password in row: 
      instance.save() 
      form1 = SignUpForm() # <-- you forgot() 
      context={ 
       "form":form1, 
       "instance":instance 
      } 
      return render(request, "profile.html", context)    

    title= 'welcome back' 
    context ={ 
     "title":title, 
     "form":form 
    } 
    return render(request, "login.html", context) 
+0

並且不要用'form1'或'form2'來命名這些變量,這是非常糟糕的命名,並且可能會導致您很多頭疼以後的 – doniyor

+0

它仍然不起作用。 –

+0

'row'不是可迭代的,'in'需要迭代的東西,因此你得到的錯誤。爲什麼不使用普通的django orm來從db獲取用戶名和密碼?這裏使用raw sql真的很奇怪。 – doniyor

相關問題