尝试从 Django 1.7 中的表单保存 model.db 时出现 AttributeError __exit__
AttributeError __exit__ while trying to save a model.db from a form in Django 1.7
我用 django.db.models.Model
创建了一个模型
class MyModel(models.Model):
my_field = models.CharField(max_length=50)
以及使用 django.forms.ModelForm 的表格。
class MyModelForm(ModelForm):
class Meta:
model = MyModel
exclude = []
由于之前的问题在我不应该的时候覆盖了 init,我对 MyModel.save() 进行了单元测试。所以单元测试通过了。我还可以使用初始化脚本填充数据库,所以我认为我的模型没有问题。但是当我使用表单中的数据时,我无法保存它。
这是我用来从表单中恢复对象的代码:
if request.method == 'POST':
form = MyModelForm(request.POST)
if form.is_valid():
my_model_object = form.save()
return render(request, 'validate.html')
else:
form = MyModelForm()
return render(request, 'create_mymodel.html',
{'form': form})
不幸的是,当我调用 save() 时出现以下错误:
my_project/views/views.py in my_function
my_model_object = form.save()
...django/db/models/base.py in save
force_update=force_update, update_fields=update_fields)
...django/db/models/base.py in save_base
self._save_parents(cls, using, update_fields)
...django/db/models/base.py in _save_parents
self._save_table(cls=parent, using=using, update_fields=update_fields)
...django/db/models/base.py in _save_table
result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
...django/db/models/base.py in _do_insert
using=using, raw=raw)
...django/db/models/manager.py in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
...django/db/models/query.py in _insert
return query.get_compiler(using=using).execute_sql(return_id)
...django/db/models/sql/compiler.py in execute_sql
with self.connection.cursor() as cursor:
AttributeError at my_url/
__exit__
Request Method: POST
Request URL: http://localhost:8000/my_url/
Django Version: 1.7
Exception Type: AttributeError
Exception Value: __exit__
如果我使用 save(commit=False) 它会工作,但当然我的对象不在数据库中。我还尝试使用表单中的所有属性并实例化和保存 MyModel,但它也不起作用。事实上,如果我在任何时候尝试保存它,我都会收到错误消息。我的代码基于 https://docs.djangoproject.com/en/1.7/topics/forms/modelforms/.
有什么建议吗?
因为即使它不起作用我也不得不将它投入生产,所以我做了..问题消失了。所以我认为这是数据库配置的问题。然后问题在一个不相关的 django 项目上出现相同,我碰巧复制粘贴了调试配置。
原来是django debug toolbar的配置引起的,具体哪里不知道,因为我只是简单的压制了一下。如果您遇到同样的问题,请检查您的设置文件!
我用 django.db.models.Model
创建了一个模型class MyModel(models.Model):
my_field = models.CharField(max_length=50)
以及使用 django.forms.ModelForm 的表格。
class MyModelForm(ModelForm):
class Meta:
model = MyModel
exclude = []
由于之前的问题在我不应该的时候覆盖了 init,我对 MyModel.save() 进行了单元测试。所以单元测试通过了。我还可以使用初始化脚本填充数据库,所以我认为我的模型没有问题。但是当我使用表单中的数据时,我无法保存它。
这是我用来从表单中恢复对象的代码:
if request.method == 'POST':
form = MyModelForm(request.POST)
if form.is_valid():
my_model_object = form.save()
return render(request, 'validate.html')
else:
form = MyModelForm()
return render(request, 'create_mymodel.html',
{'form': form})
不幸的是,当我调用 save() 时出现以下错误:
my_project/views/views.py in my_function
my_model_object = form.save()
...django/db/models/base.py in save
force_update=force_update, update_fields=update_fields)
...django/db/models/base.py in save_base
self._save_parents(cls, using, update_fields)
...django/db/models/base.py in _save_parents
self._save_table(cls=parent, using=using, update_fields=update_fields)
...django/db/models/base.py in _save_table
result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
...django/db/models/base.py in _do_insert
using=using, raw=raw)
...django/db/models/manager.py in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
...django/db/models/query.py in _insert
return query.get_compiler(using=using).execute_sql(return_id)
...django/db/models/sql/compiler.py in execute_sql
with self.connection.cursor() as cursor:
AttributeError at my_url/
__exit__
Request Method: POST
Request URL: http://localhost:8000/my_url/
Django Version: 1.7
Exception Type: AttributeError
Exception Value: __exit__
如果我使用 save(commit=False) 它会工作,但当然我的对象不在数据库中。我还尝试使用表单中的所有属性并实例化和保存 MyModel,但它也不起作用。事实上,如果我在任何时候尝试保存它,我都会收到错误消息。我的代码基于 https://docs.djangoproject.com/en/1.7/topics/forms/modelforms/.
有什么建议吗?
因为即使它不起作用我也不得不将它投入生产,所以我做了..问题消失了。所以我认为这是数据库配置的问题。然后问题在一个不相关的 django 项目上出现相同,我碰巧复制粘贴了调试配置。
原来是django debug toolbar的配置引起的,具体哪里不知道,因为我只是简单的压制了一下。如果您遇到同样的问题,请检查您的设置文件!