Python django model.delete()引发ValueError-在使用此多对多关系之前,需要为字段设置一个值
在django ModelAdmin类中,我有一个超写的Python django model.delete()引发ValueError-在使用此多对多关系之前,需要为字段设置一个值,python,django,Python,Django,在django ModelAdmin类中,我有一个超写的save_model()方法。此模型有一个manytomy字段。 我的save_模型如下所示: def save_model(self, request, obj, form, change): creating = False to_delete = False if not obj.pk: creating = True obj.save()
save_model()
方法。此模型有一个manytomy
字段。
我的save_模型
如下所示:
def save_model(self, request, obj, form, change):
creating = False
to_delete = False
if not obj.pk:
creating = True
obj.save()
form.save_m2m()
# DETECT SOMETHING (some complicated conditions) HERE ...
detected =True
if detected:
obj.delete() # --> here is my problem
Traceback:
File "/Library/Python/2.7/site-packages/django/core/handlers/base.py" in get_response
111. response = callback(request, *callback_args, **callback_kwargs)
File "/Library/Python/2.7/site-packages/django/contrib/admin/options.py" in wrapper
366. return self.admin_site.admin_view(view)(*args, **kwargs)
File "/Library/Python/2.7/site-packages/django/utils/decorators.py" in _wrapped_view
91. response = view_func(request, *args, **kwargs)
File "/Library/Python/2.7/site-packages/django/views/decorators/cache.py" in _wrapped_view_func
89. response = view_func(request, *args, **kwargs)
File "/Library/Python/2.7/site-packages/django/contrib/admin/sites.py" in inner
196. return view(request, *args, **kwargs)
File "/Library/Python/2.7/site-packages/django/utils/decorators.py" in _wrapper
25. return bound_func(*args, **kwargs)
File "/Library/Python/2.7/site-packages/django/utils/decorators.py" in _wrapped_view
91. response = view_func(request, *args, **kwargs)
File "/Library/Python/2.7/site-packages/django/utils/decorators.py" in bound_func
21. return func(self, *args2, **kwargs2)
File "/Library/Python/2.7/site-packages/django/db/transaction.py" in inner
209. return func(*args, **kwargs)
File "/Library/Python/2.7/site-packages/django/contrib/admin/options.py" in add_view
956. self.save_related(request, form, formsets, False)
File "/Library/Python/2.7/site-packages/django/contrib/admin/options.py" in save_related
731. form.save_m2m()
File "/Library/Python/2.7/site-packages/django/forms/models.py" in save_m2m
83. f.save_form_data(instance, cleaned_data[f.name])
File "/Library/Python/2.7/site-packages/django/db/models/fields/related.py" in save_form_data
1273. setattr(instance, self.attname, data)
File "/Library/Python/2.7/site-packages/django/db/models/fields/related.py" in __set__
859. manager = self.__get__(instance)
File "/Library/Python/2.7/site-packages/django/db/models/fields/related.py" in __get__
846. through=self.field.rel.through,
File "/Library/Python/2.7/site-packages/django/db/models/fields/related.py" in __init__
538. (instance, source_field_name))
Exception Type: ValueError at /admin/lawis_core/invoice/add/
Exception Value: "<Invoice: 1301000>" needs to have a value for field "invoice" before this many-to-many relationship can be used.
def save_模型(自我、请求、对象、表单、更改):
创建=假
删除=错误
如果不是obj.pk:
创建=真
obj.save()
表单.保存_m2m()
#在这里检测到一些东西(一些复杂的情况)。。。
检测到=真
如果检测到:
obj.delete()#-->这是我的问题
回溯:
get_响应中的文件“/Library/Python/2.7/site packages/django/core/handlers/base.py”
111响应=回调(请求,*回调参数,**回调参数)
包装器中的文件“/Library/Python/2.7/site packages/django/contrib/admin/options.py”
366返回self.admin\u site.admin\u视图(视图)(*args,**kwargs)
视图中的文件“/Library/Python/2.7/site packages/django/utils/decorators.py”
91响应=查看功能(请求,*args,**kwargs)
文件“/Library/Python/2.7/site packages/django/views/decorators/cache.py”
89响应=查看功能(请求,*args,**kwargs)
文件“/Library/Python/2.7/site packages/django/contrib/admin/sites.py”,位于内部
196返回视图(请求、*args、**kwargs)
包装器中的文件“/Library/Python/2.7/site packages/django/utils/decorators.py”
25返回边界函数(*args,**kwargs)
视图中的文件“/Library/Python/2.7/site packages/django/utils/decorators.py”
91响应=查看功能(请求,*args,**kwargs)
绑定函数中的文件“/Library/Python/2.7/site packages/django/utils/decorators.py”
21返回函数(self,*args2,**kwargs2)
文件“/Library/Python/2.7/site packages/django/db/transaction.py”,位于内部
209返回函数(*args,**kwargs)
添加视图中的文件“/Library/Python/2.7/site packages/django/contrib/admin/options.py”
956与self.save_相关(请求、表单、表单集、False)
文件“/Library/Python/2.7/site packages/django/contrib/admin/options.py”,位于与save_相关的
731表单.保存_m2m()
save_m2m中的文件“/Library/Python/2.7/site packages/django/forms/models.py”
83f、 保存表单数据(实例,已清理的表单数据[f.name])
保存表单数据中的文件“/Library/Python/2.7/site packages/django/db/models/fields/related.py”
1273setattr(实例、self.attname、数据)
文件“/Library/Python/2.7/site packages/django/db/models/fields/related.py”位于__
859manager=self.\uuu获取\uu(实例)
文件“/Library/Python/2.7/site packages/django/db/models/fields/related.py”位于__
846through=self.field.rel.through,
init中的文件“/Library/Python/2.7/site packages/django/db/models/fields/related.py”__
538(实例,源\字段\名称))
异常类型:ValueError位于/admin/lawis\u core/invoice/add/
异常值:“发票”字段需要有一个值才能使用此多对多关系。
是不是忘了调用超级类?像这样:
class YourAdmin(admin.ModelAdmin)
def save_model(self, request, obj, form, change):
super(YourAdmin, self).save_model(request, obj, form, change)
# Your code ...
添加了回溯-我添加了这一点,但它没有修复它…-另外,这个超级类是常规的modelAdmin类,它只执行我自己做的操作-save()和save_m2m()。问题可能是,
save_model
在save_formset
之前运行,save_model
需要一个您刚刚在save_model
中删除的实例。然而,在这种情况下,我本以为会出现验证错误,所以我有点不知所措。是的。。。我认为这毕竟不是一个很好的方法。。。我将尝试将其重写为验证错误(在清除我的表单类时),我遇到了相同的问题,并在保存所有表单集和m2m时,在save_related
的末尾处理obj.delete
。