在 django 中更新用户组时出错?



在这里,我正在尝试添加/更新组名和用户权限,我尝试过这样做。

对于添加它工作正常,但是在使用功能edit_user_group更新时,我遇到了问题。 问题是

异常类型: 完整性错误异常值: (1062, "重复 关键字"名称"的条目"开发人员"(

我认为这是因为一对一的关系。如何在此处更新用户组?

views.py

@permission_required('organization.add_user_group', raise_exception=True)
def add_user_groups(request):
form = AddUserGroupForm()
user_permissions = Permission.objects.all()
if request.method == 'POST':
form = AddUserGroupForm(request.POST)
if form.is_valid():
group_name = form.cleaned_data['name']
permissions = request.POST.getlist('user_permissions')
new_group = Group.objects.create(name=group_name)
new_group.permissions.set(permissions)
messages.success(request, 'New group added.')
return redirect('organization:view_user_groups')
return render(request, 'organization/add_user_groups.html', {'user_permissions': user_permissions, 'form': form})
@permission_required('organization.edit_user_group', raise_exception=True)
def edit_user_group(request, pk):
group = get_object_or_404(Group, pk=pk)
user_permissions = Permission.objects.all()
form = AddUserGroupForm()
if request.method == 'POST':
form = AddUserGroupForm(request.POST)
if form.is_valid():
name = form.cleaned_data['name']
permissions = request.POST.getlist('user_permissions')
group = Group.objects.update(name=name)
group.permissions.set(permissions)
messages.success(request, '{} group Updated.'.format(group.name))
return redirect('organization:detail_user_group',group.pk)
return render(request,'organization/edit_user_group.html',{'group':group,'form':form,'user_permissions':user_permissions})

forms.py

class AddUserGroupForm(forms.Form):
name = forms.CharField(max_length=255)

编辑组的模板

<form action="{% url 'organization:edit_user_group' group.pk %}" method="post">
{% csrf_token %}
<label> Group Name : </label>
<input type="text" value="{{group.name}}" name="name">
<b class="text-danger">
{{ form.name.errors|striptags }}
</b>
<label>Permissions ({{user_permissions|length}}):</label>
{% for permission in user_permissions %}              
<input name="user_permissions" type="checkbox" id="permission-{{permission.id}}"
value="{{permission.id}}"
{% if permission in group.permissions.all %} checked {% endif %}>
<label for="permission-{{permission.id}}"> {{permission.name}}</label>
{% endfor %}

编辑:正如@Shashank建议的那样 在尝试获取它时返回模型对象,但说

Exception Type: AttributeError
Exception Value:    
'Group' object has no attribute 'update' 
group = Group.objects.get(pk=pk).update(name=name)

在使用过滤器时,它返回 int 而不是实例,因此它会抛出

Exception Value:    
'int' object has no attribute 'permissions'
group = Group.objects.filter(pk=pk).update(name=name)

您编写的这一行每Group更新一次 -group = Group.objects.update(name=name),并且由于名称的唯一约束而

尝试时它不起作用。用group.name = name替换怎么样,group.save()

完整性异常基本上告诉您,在代码中的某个地方,您正在尝试将不同组对象的名称设置为禁止的"开发人员"(由于 UNIQUE 约束(。

在你的函数def edit_user_group(request, pk)中,而不是Group.objects.update,你应该做Group.objects.get(name=name)

即从

group = Group.objects.update(name=name)

group = Group.objects.get(name=name)

您的意图并不完全清楚 - 您是否要(也(更改组名或仅更改权限(并且使用update()而不是"get(("只是一个错字(?

在第一种情况下,您需要:

group = Group.objects.get(name=name)
group.name = name
group.save()
group.permissions.set(permissions)

但是由于对Group.name有一个独特的约束,因此在保存之前也必须对此进行验证。

在第二种情况下,您当然只需要

group = Group.objects.get(name=name)
group.permissions.set(permissions)

话虽如此,使用模型表单将为您节省大量时间和痛苦......

相关内容

  • 没有找到相关文章

最新更新