Django简单验证码 - {{ form.as_p }}错误 - 'DatabaseWrapper'对象没有属性'Database

1 投票
1 回答
897 浏览
提问于 2025-04-18 04:42

我正在使用Django 1.6和mongoengine。

我刚开始尝试使用简单的验证码,但遇到了一个错误。

正如在这个链接中所说的,我在我的环境中安装了它,并把它添加到了已安装的应用程序中。我没有运行syncdb,因为我使用的是MongoDB,这个步骤是不必要的。最后,我在我的网址应用文件中添加了url(r'^captcha/', include('captcha.urls'))。

我的form.py看起来是这样的:

from django import forms
from captcha.fields import CaptchaField

class PostForm(forms.Form):
    user = forms.CharField(max_length=256)
    password = forms.CharField(widget=forms.PasswordInput)
    email = forms.CharField(max_length=256)
    captcha = CaptchaField()

而我的视图是:

def post_form_upload(request):
    if request.method == 'GET':
        form = PostForm()
    else:
        # A POST request: Handle Form Upload
        form = PostForm(request.POST) # Bind data from request.POST into a PostForm

        # If data is valid, proceeds to create a new post and redirect the user
        if form.is_valid():
            user = form.cleaned_data['user']
            password = form.cleaned_data['password']
            email = form.cleaned_data['email']
            connect('reborn')
            User.create_user(user,password,email)
            #return HttpResponse("Usuari nou creat")
            return render(request, 'game/welcomeuser.html', {
                'user': user,
            })
    return render(request, 'game/post_form_upload.html', {
        'form': form,
    })

所以当表单被渲染时,它给了我这个错误:

AttributeError at /game/form_upload.html
'DatabaseWrapper' object has no attribute 'Database'

In template /.../post_form_upload.html, error at line 2
'DatabaseWrapper' object has no attribute 'Database'
1   <form action='/game/form_upload.html' method='post'>{% csrf_token %}
2   {{ form.as_p }} <- HERE
3   <input type='submit' value='Submit' />
4   </form>
5   

form.as_p有什么问题吗?如果没有这个验证码,之前运行得很好。

1 个回答

0

你需要运行 syncdb、migrate,或者用其他方式创建表 captcha_captchastore,因为这个表是简单验证码所必需的。

编辑:我可能在创建数据库结构这方面搞错了,因为你说得对,这个表并不是必须的。

不过我有个想法。MongoDB 引擎使用了 djangotoolbox,里面有个类 djangotoolbox.db.base.NonrelDatabaseWrapper,在这个 提交记录 (标记的行) 之前,它没有那个属性 Database。所以要确保你使用的是正确的版本。

如果我说错了,或者有其他实际的解决方案,请告诉我。

撰写回答