在 django 中创建表单时对象不可调用错误

Posted

技术标签:

【中文标题】在 django 中创建表单时对象不可调用错误【英文标题】:object is not callable error when creating a form in django 【发布时间】:2013-07-06 15:06:01 【问题描述】:

我正在使用 django 并尝试创建一个注册表单,下面是我的代码

forms.py

from django import forms

attrs_dict =  'class': 'required' 

class RegistrationForm(forms.Form):
    username = forms.RegexField(regex=r'^\w+$',
                                max_length=30,
                                widget=forms.TextInput(attrs=attrs_dict),
                                label=_(u'username'))
    email = forms.EmailField(widget=forms.TextInput(attrs=dict(attrs_dict,maxlength=75)),
                                label=_(u'email address'))
    password1 = forms.CharField(widget=forms.PasswordInput(attrs=attrs_dict, render_value=False),
                                label=_(u'password'))
    password2 = forms.CharField(widget=forms.PasswordInput(attrs=attrs_dict, render_value=False),
                                label=_(u'password (again)'))

views.py

from authentication.forms import RegistrationForm

def register(request):
    regsiter_form = RegistrationForm()
    if request.method=='POST':
        form = regsiter_form(request.POST)
        if form.is_valid():
            new_user = User.objects.create_user(username=request.POST['username'], 
                                                email=request.POST['email'], 
                                                password=request.POST['password1'])
            new_user.is_active = False
            new_user.save()
            return HttpResponseRedirect(reverse('index'))
    return render_to_response('registration/registration_form.html''form':regsiter_form)

所以当我们转到 url 时,会显示一个注册表单,当我们输入详细信息并单击提交时,我收到以下错误

TypeError at /accounts_register/register/
'RegistrationForm' object is not callable
Request Method: POST
Request URL:    http://localhost:8000/accounts_register/register/
Django Version: 1.5.1
Exception Type: TypeError
Exception Value:    
'RegistrationForm' object is not callable

追溯

▶ Local vars
/home/user/package/authentication/views.py in register
        form = regsiter_form(request.POST) 

所以谁能告诉我为什么上面的表单对象因为该对象不可调用而抱怨,以及我们需要在哪里进行更改以避免此错误。

【问题讨论】:

【参考方案1】:

应该是:

def register(request):
    register_form = RegistrationForm()
    if request.method=='POST':
        form = RegistrationForm(request.POST)
        if form.is_valid():
            new_user = User.objects.create_user(username=request.POST['username'], 
                                            email=request.POST['email'], 
                                            password=request.POST['password1'])
            new_user.is_active = False
            new_user.save()
            return HttpResponseRedirect(reverse('index'))
    return render_to_response('registration/registration_form.html''form':register_form)

所以,form = register_form(request.POST) 应该是您的 POST 检查中的form = RegistrationForm(request.POST)

关键是您首先使用register_form = RegistrationForm() 创建了RegistrationForm 的对象/实例,然后您尝试了register_form(request.POST),所以基本上您尝试再次调用不允许的对象/实例,除非有@987654326 @你的类上定义的方法。

【讨论】:

【参考方案2】:

代替

form = regsiter_form(request.POST)

regsiter_form = RegistrationForm(request.POST)

并使用register_form 对象而不是form

另外,使用来自form.cleaned_data 的数据而不是来自request.POST 的数据来创建用户对象

作为

new_user = User.objects.create_user(username=form.cleaned_data['username'] ...)

【讨论】:

以上是关于在 django 中创建表单时对象不可调用错误的主要内容,如果未能解决你的问题,请参考以下文章

在线程中创建的 SQLite 对象只能在 Django 2.2.2 和 ipdb 的同一线程中使用

如何在django创建模板中创建对象时自动插入当前用户?

Django Form表单

如何在 Django 中创建用于编辑的填充表单

如何使用 TemplateHTMLRenderer 在 Django-REST-Framework 中创建/放置?

如何从 django 的表单中获取数据?