想要在表单和数据库中添加另一个字段django

时间:2015-11-02 02:22:30

标签: django django-models django-forms django-views django-database

我尝试在forms.py和models.py

中添加另一个字段(pin)

我得到的错误是

“/ student / signup /”中的FieldError 无法将关键字'pin'解析为字段。选项包括:date_joined,email,first_name,groups,id,is_active,is_staff,is_superuser,last_login,last_name,logentry,password,user_infos,user_permissions,username“

forms.py

 class RegisterForm(forms.Form):
    GRADE_CHOICES = ( 
                (9,'9'), (10,'10'), (11,'11'), (12,'12') , 
            )
    curr_year = date.today().year
    GRAD_YEAR_CHOICES = ( 
                (curr_year,curr_year), (curr_year+1,curr_year+1), (curr_year+2,curr_year+2), (curr_year+3,curr_year+3) , 
                 )
    first_name = forms.CharField(max_length = 25)
    last_name = forms.CharField( max_length = 25)
    emailid = forms.EmailField()
    passwd1 = forms.CharField(max_length=100,widget=forms.PasswordInput)
    passwd2 = forms.CharField(max_length=100,widget=forms.PasswordInput)
    gradyear = forms.ChoiceField( choices=GRAD_YEAR_CHOICES)
    grade = forms.ChoiceField( choices=GRADE_CHOICES)
    pin = forms.IntegerField()
    def clean(self):
        cleaned_data = super(RegisterForm, self).clean()
        print cleaned_data
        if cleaned_data['passwd1'] != cleaned_data['passwd2']:
            raise forms.ValidationError({'passwd1':['Password do not match']})

        if User.objects.filter(email=cleaned_data['emailid']).count():
            raise forms.ValidationError({'emailid':['Email already taken ']})
        if User.objects.filter(pin=cleaned_data['pin']).count():
            raise forms.ValidationError({'pin':['Pin already taken ']})

        return cleaned_data

views.py

 def signup(request):
        print "signup"
        if request.method == 'POST':
            print "post signup"
            form = RegisterForm(request.POST)
            try:
                if form.is_valid():
                    print form.cleaned_data
                    u = User.objects.create_user(form.cleaned_data['emailid'], form.cleaned_data['emailid'], form.cleaned_data['passwd1'] )
                    ui = UserInfo()
                    ui.user = u
                    ui.class_of = form.cleaned_data['gradyear']
                    ui.grade = form.cleaned_data['grade']
                    ui.balance = 0
                    print "Hi"
                    ui.pin = form.cleaned_data['pin']
                    print ui.pin
                    u.first_name = form.cleaned_data['first_name']
                    u.last_name = form.cleaned_data['last_name']
                    u.save()
                    ui.save()
                    user = authenticate(username=form.cleaned_data['emailid'], password=form.cleaned_data['passwd1'])
                    login(request,user)
                    print "after login in signup"
                    return redirect("/")


                else:
                    print "error"
                    print form.errors
            except:
                raise
                print "error here"
                print form.errors
                pass
                #return render(request, 'student/register.html', {'form': form})

        else:
            form = RegisterForm()

        return render(request, 'student/register.html', {'form': form})

models.py:

 class UserInfo(models.Model):
    user = models.OneToOneField(User, related_name='user_infos')
    class_of = models.IntegerField()
    #username = user.username
    #fname = user.fname
    #lname = user.last_name
    #email = user.email
    #Staff = user.is_staff
    pub_date = models.DateTimeField( auto_now=True)
    grade = models.IntegerField()
    balance = models.DecimalField(max_digits=6, decimal_places=2)
    pin = models.IntegerField()
    #first_name = models.CharField(max_length = 25)

我认为不是这样做的。有没有办法以另一种方式在数据库中添加另一列?

1 个答案:

答案 0 :(得分:0)

你有" pin" UserInfo 模型中的字段,但在forms.py中,您尝试过滤用户模型:

if User.objects.filter(pin=cleaned_data['pin']).count():

用户模型没有" pin"字段,因此您收到该错误消息。

另外,我建议您学习并开始使用ModelForms:https://docs.djangoproject.com/en/1.8/topics/forms/modelforms/