Django log_update() 为参数 'user' 获取了多个值



我得到TypeError log_update((在尝试在数据库中创建实例时为参数"user"获取了多个值。

构造 函数

class ChangeLogManager(models.Manager):
use_in_migration = True
def log_update(user, content_type, object_id, content_object, changes, date_of_change):
return self.model.objects.create(
user = user,
content_type = content_type,
object_id = object_id,
content_object = content_object,
changes = changes,
date_of_change = date_of_change,
)

视图

def editUser(request, pk):
# Query appropriate user based on pk returned in url
user = User.objects.get(pk = pk)
# Get the EditUserForm and add the user as instance
edit_user_form = EditUserForm(instance = user)
if request.method == 'POST':
# Bind data to the form class, and add the user as instance
edit_user_form = EditUserForm(request.POST, error_class=DivErrorList, instance = user)
old_user_instance = User.objects.get(pk = pk)
# Validate form inputs
if edit_user_form.is_valid():
# Save edits
edit_user_form.save()
# Log change
ChangeLog.change_message(request.user.id, User, old_user_instance)
else:
# error
context = {
'user': user,
'edit_user_form': edit_user_form,
}
# Render request, template and context
return render(request, 'users/backend/user/user_edit.html', context)

方法

def change_message(request, obj, old_instance):
new_instance = obj.objects.get(pk = old_instance.pk)
ct = ContentType.objects.get_for_model(new_instance)
for field in obj._meta.get_fields():
if isinstance(field, models.ManyToOneRel):
continue
old_value = getattr(old_instance, field.name)
new_value = getattr(new_instance, field.name)
if old_value != new_value:
change_message = json.dumps({"field": field.name, "old_value": old_value, "new_value": new_value})
ChangeLog.objects.log_update(
user = request,
content_type = ct.pk,
object_id = new_instance.pk,
changes = change_message,
)

错误发生在user = request,行上。我尝试查看其他线程,并将self和移动request添加为方法中的第一个参数,但没有运气。我还读过用**kwargs替换方法参数的最佳做法,但由于我是新手,我不确定如何在方法本身中检索所需的参数。

编辑 - 回溯

[28/Dec/2019 20:53:02] "GET /backend/users/1/edit/ HTTP/1.1" 200 30770
Internal Server Error: /backend/users/1/edit/
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/django/core/handlers/base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/django/core/handlers/base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/daniel/Projects/proj/Code/puro/users/views.py", line 191, in editUser
ChangeLog.change_message(request.user.id, User, old_user_instance)
File "/Users/daniel/Projects/proj/Code/puro/utils/models.py", line 63, in change_message
ChangeLog.objects.log_update(
TypeError: log_update() got multiple values for argument 'user'

您需要将self作为第一个参数添加到log_update方法中,并且需要将其他必需的参数传递给该方法

ChangeLog.objects.log_update(
user = request,
content_type = ct.pk,
object_id = new_instance.pk,
content_object=new_instance,
changes = change_message,
date_of_change=datetime.datetime.now()
)

最新更新