Редактирование всех пользователей в шаблоне на сайте Django

Рейтинг: 0Ответов: 0Опубликовано: 23.05.2023

Можно ли находясь на сайте под суперпользователем администрировать любые учетные записи пользователей, а именно изменить активность, изменить права, убрать/добавить группы или удалить пользователя, не переходя в админскую часть сайта?

Есть views.py

class UserUpdate(LoginRequiredMixin, UserUpdateMixin, View):
    model = CustomUser
    model_form = CustomUserChangeForm
    template = 'users/update_profile.html'
    raise_exception = True

Есть mixin:

class UserUpdateMixin:
    model = None
    model_form = None
    template = None

    def get(self, request, username):
        obj = self.model.objects.get(username__iexact=username)
        bound_form = self.model_form(instance=obj)
        return render(request, self.template, context={'form': bound_form, self.model.__name__.lower(): obj})

    def post(self, request, username):
        obj = self.model.objects.get(username__iexact=username)
        bound_form = self.model_form(request.POST, instance=obj)

        if bound_form.is_valid():
            new_obj = bound_form.save()
            return redirect(new_obj)
        return render(request, self.template, context={'form': bound_form, self.model.__name__.lower(): obj})

urls.py

path('user_profile/<str:username>/', UserDetail.as_view(), name='user-profile'),
path('update_profile/<str:username>/update/', UserUpdate.as_view(), name='update_profile'),

Вопрос для комментатора @andreymal: Где настраиваются права для доступа к учетным записям пользователей, которые впринципе зарегистрированы, а не для текущего пользователя?

Дополнение: модель пользователя

class CustomUser(AbstractUser):
    organization = models.CharField(max_length=255, blank=True, db_index=True, verbose_name="Организация")
    position = models.CharField(max_length=128, verbose_name="Должность")
    work_experience = models.CharField(max_length=64, blank=True, verbose_name="Опыт работы")

    def get_absolute_url(self):
        return reverse('user-profile', kwargs={'username': self.username})

    def get_update_url(self):
        return reverse('update_profile', kwargs={'username': self.username})

    def get_delete_url(self):
        return reverse('post_delete_url', kwargs={'username': self.username})

    def __str__(self):
        return self.username

Шаблон пользователя:

{% extends "base.html" %}
{% load static %}

{% block content %}

<div class="row">
    <div class="col-md-12">
        <div class="col-xs-12 col-sm-12 col-md-8 col-lg-8 col-xs-offset-0 col-sm-offset-0 col-md-offset-2 col-lg-offset-2 toppad">
            <div class="panel panel-info">
                <div class="panel-heading">
                    <h3 class="panel-title"><fa-icon [icon]="faUser"></fa-icon> Профиль пользователя</h3>
                </div>
                <div class="panel-body">
                    <div class="row">
                        <div class="col-md-3 col-lg-3" align="center">
                            <img alt="User Pic" src="https://lh5.googleusercontent.com/-b0-k99FZlyE/AAAAAAAAAAI/AAAAAAAAAAA/eu7opA4byxI/photo.jpg?sz=100" class="img-circle">
                            <br />
                        </div>

                        <div class=" col-md-9 col-lg-9">
                            <table class="table table-user-information borderless">
                                <tbody>
                                <tr>
                                    <td>Имя:</td>
                                    <td>{{user.first_name}}</td>
                                </tr>
                                <tr>
                                    <td>Фамилия:</td>
                                    <td>{{user.last_name}}</td>
                                </tr>
                                <tr>
                                    <td>Адрес электронной почты:</td>
                                    <td>{{user.email}}</td>
                                </tr>
                                <tr>
                                    <td>Организация:</td>
                                    <td>{{user.organization}}</td>
                                </tr>
                                <tr>
                                    <td>Должность:</td>
                                    <td>{{user.position}}</td>
                                </tr>
                                <tr>
                                    <td>Опыт работы:</td>
                                    <td>{{user.work_experience}}</td>
                                </tr>
                                </tbody>
                            </table>
                        </div>
                    </div>
                </div>

                <div class="panel-footer">
                    <a href="{{ admin_object.get_update_url }}" class="btn btn-primary">Редактировать</a>
                    <!--
                    <a data-original-title="Broadcast Message" data-toggle="tooltip" type="button" class="btn btn-sm btn-primary"><i class="glyphicon glyphicon-envelope"></i></a>
                    <span class="pull-right">
                        <a href="edit.html" data-original-title="Edit this user" data-toggle="tooltip" type="button" class="btn btn-sm btn-warning"><i class="glyphicon glyphicon-edit"></i></a>
                    </span>
                    -->
                </div>

            </div>
        </div>
    </div>
</div>
{% endblock %}

Шаблон редактирования пользователя:

{% extends "base.html" %}
{% load static %}
{% block title %}
    Редактирование пользователя {{ user.username|title }}
{% endblock %}
{% block content %}

<div class="card">
    <div class="card-body">
        <form action="{{ user.get_update_url }}" method="post">
          {% csrf_token %}
            {% for field in form %}
            <div class="form-group">
                {% if field.errors %}
                <div class="alert alert-danger">
                    {{ field.errors }}
                </div>
                {% endif %}
            <div class="mb-3">
                <label class="form-label">{{ field.label }}</label>
                {{ field }}
            </div>
            </div>
            {% endfor %}
            <a href="{{ user.get_absolute_url }}" class="btn btn-primary">Отмена</a>
            <button type="submit" class="btn btn-success">Обновить профиль</button>
        </form>
    </div>
</div>
{% endblock %}

И есть еще список всех пользователей, но там я пока не придумал как вставить кнопку для редактирования любого из пользователей:

{% extends "base.html" %}
{% load static %}
{% block content %}
<div class="clearfix"><br/></div>
<div class="col-md-12 mb-3">
  <p><h4>Список пользователей (всего {{ count }}):</h4></p>
</div>
<div class="clearfix"><br/></div>
<div class="table-responsive">
    <table class="table table-striped">
      <thead>
        <tr>
          <th scope="col">#</th>
          <th scope="col">Имя</th>
          <th scope="col">Фамилия</th>
          <th scope="col">Организация</th>
          <th scope="col">Должность</th>
          <th scope="col">Персонал</th>
          <th scope="col">Статус</th>
        </tr>
      </thead>
      <tbody>
      {% for user in page_object.object_list %}
        <tr>
          <th scope="row">{{ forloop.counter }}</th>
          <td>{{user.first_name}}</td>
          <td>{{user.last_name}}</td>
          <td>{{user.organization}}</td>
          <td>{{user.position}}</td>
          <td>{% if user.is_staff %}<i style="color:green" class="fa fa-check-circle" aria-hidden="true"></i>{% else %}<i style="color:red" class="fa fa-times-circle-o" aria-hidden="true"></i>{% endif %}</td>
          <td>{% if user.is_active %}<i style="color:green" class="fa fa-check-circle" aria-hidden="true"></i>{% else %}<i style="color:red" class="fa fa-times-circle-o" aria-hidden="true"></i>{% endif %}</td>
          <td>{% if user.is_active %}<i style="color:green" class="fa fa-check-circle" aria-hidden="true"></i>{% else %}<i style="color:red" class="fa fa-times-circle-o" aria-hidden="true"></i>{% endif %}</td>
        </tr>
      {% endfor %}
      </tbody>
    </table>
</div>
{% endblock %}

Ответы

Ответов пока нет.