str'对象不可调用

0 投票
1 回答
942 浏览
提问于 2025-04-17 21:05

我在使用Django的时候遇到了一个问题:

'str' object is not callable

代码:

urls.py 应用 Usuarios:

from django.conf.urls import patterns, include, url
from django.contrib.auth.views import login, logout_then_login
from usuarios.views import Registro

urlpatterns = patterns('',
    url(r'^login/$', 'django.contrib.auth.views.login', {'template_name':'registration/login.html'},
                name='login'),

        url(r'^cerrar/$', 'django.contrib.auth.views.logout_then_login', 
        name='logout'),

    url(r'^registro/$', 'Registro', name='registro'),
)

views.py

from django.http import HttpResponse, HttpResponseRedirect
from django.contrib.auth import authenticate, login, logout
from django.core.context_processors import csrf

#importar el formulario de registro
from usuarios.forms import RegistroUsuario


def Registro(request):
    if request.user.is_anonymous():
        if request.method == 'POST':
        form = RegistroUsuario(request, POST)
        if form.is_valid():
                    form.save()
            return HttpResponse('Usuario creado sin problemas.')
            else:
        form = RegistroUsuario()
        context = {}
        context.update(csrf(request))
        context['form'] = form
        #pasar el context al template
        return render_to_response('registro.html', context)
    else:
        return HttpResponseRedirect('/')

forms.py:

from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm


class RegistroUsuario(UserCreationForm):
    class Meta:
        fields = ('first_name', 'last_name', 'email', 'username', 'password1', 'password2')

我对Django不太熟悉,老实说,错误信息并没有告诉我具体哪里出错了。

Environment:


Request Method: GET
Request URL: http://127.0.0.1:8000/usuarios/registro/

Django Version: 1.6.2
Python Version: 2.7.6
Installed Applications:
('django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'usuarios')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware')


Traceback:
File "C:\Python27\lib\site-packages\django\core\handlers\base.py" in get_response
  114.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)

Exception Type: TypeError at /usuarios/registro/
Exception Value: 'str' object is not callable

1 个回答

1

你在URL的设置中给视图起了个错误的名字:

from usuarios.views import Registro

urlpatterns = patterns('',
    # ...

    url(r'^registro/$', 'Registro', name='registro'),

这里的 'Registro' 不是Django能识别的名字(它不是一个完整的模块路径),而且你也没有指定要从哪个地方导入(patterns() 的第一个参数是一个空字符串 '')。

你应该要么直接给出实际的视图对象(你已经在这里导入过了),要么给出完整的模块路径。

所以你可以选择以下其中一种:

from usuarios.views import Registro

urlpatterns = patterns('',
    # ...

    url(r'^registro/$', Registro, name='registro'),

或者

urlpatterns = patterns('',
    # ...

    url(r'^registro/$', 'usuarios.views.Registro', name='registro'),

第一个选项是把实际的视图函数传给注册(这样可以正常工作,因为你已经导入过了)。

第二个选项则是除了视图名字外,还给出了模块的完整路径;这样Django就能导入它了(它会在字符串中查找 . 来判断是否可以导入)。

撰写回答