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

Error while updating user group in django?

我在这里尝试 add/update 组名和用户权限,我是这样尝试的。

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

Exception Type: IntegrityError Exception Value: (1062, "Duplicate entry 'Developer' for key 'name'")

我认为这是因为 OneToOne 关系。我如何在这里更新用户组?

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 而不是 instance 所以它抛出

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 = namegroup.save()

替换怎么样

完整性异常基本上是在告诉您,您在代码中的某处试图将不同组对象的 name 设置为 'Developer',这是被禁止的(由于唯一约束)。

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

而不是 Group.objects.update

即来自

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)

话虽这么说,使用模型会为您节省很多时间和痛苦...