Ошибка при обновлении группы пользователей в Django? - PullRequest
1 голос
/ 25 сентября 2019

Здесь я пытаюсь добавить / обновить имя группы и права пользователя, и я попробовал вот так.

Для добавления это работает нормально, но при обновлении с функцией edit_user_group у меня возникла проблема.Проблема в

Тип исключения: IntegrityError Значение исключения: (1062, «Дублирующая запись« Разработчик »для ключа« имя »»)

Я думаю, что это из-за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 вместо экземпляра, поэтому выдает

Exception Value:    
'int' object has no attribute 'permissions'

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

Ответы [ 3 ]

2 голосов
/ 25 сентября 2019

Исключение целостности в основном говорит вам, что где-то в вашем коде вы пытаетесь установить имя для различных групповых объектов в 'Разработчик', что запрещено (из-за ограничения 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)
2 голосов
/ 25 сентября 2019

Ваше намерение не совсем ясно - вы хотите (также) изменить имя группы или просто изменить разрешения (и использование 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)

Как говорится, использование моделей формы сэкономит вам много времени и усилий ...

2 голосов
/ 25 сентября 2019

Эта строка, которую вы написали, обновляется каждые Group - group = Group.objects.update(name=name), и когда она пытается это сделать, она не работает из-за уникального ограничения на имя.

Как насчет замены на group.name = name, group.save()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...