Редактирование всех пользователей в шаблоне на сайте Django
Можно ли находясь на сайте под суперпользователем администрировать любые учетные записи пользователей, а именно изменить активность, изменить права, убрать/добавить группы или удалить пользователя, не переходя в админскую часть сайта?
Есть 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 %}
Источник: Stack Overflow на русском