Django: Форма обновления профиля пользователя показывает данные только одного пользователя

Я создаю сайт электронной коммерции на Django, и у меня возникли проблемы с обновлением профилей пользователей. Я хочу отображать список пользователей и предоставлять возможность просматривать и обновлять профиль каждого из них. Однако в настоящее время я могу просматривать и обновлять профиль только вошедшего в систему пользователя.

Вот моя текущая реализация:

views.py:

def user_list(request):
    users = CustomUser.objects.all()
    return render(request, 'useradmin/user_list.html', {'users': users})



@login_required
def user_profile_update(request):
    try:
        profile = Profile.objects.get(user_name=request.user)
    except Profile.DoesNotExist:
        return render(request, 'useradmin/error.html', {'message': 'Profile does not exist.'})

    if request.method == "POST":
        image = request.FILES.get("image")
        full_name = request.POST.get("full_name")
        phone = request.POST.get("phone")
        Address = request.POST.get("Address")
        diamond_user = request.POST.get("diamond_user")
        golden_user = request.POST.get("golden_user")

        if image:
            profile.image = image

        profile.full_name = full_name
        profile.phone = phone
        profile.Address = Address
        profile.diamond_user = diamond_user == 'on'  # Checkbox values need special handling
        profile.golden_user = golden_user == 'on'

        profile.save()
        messages.success(request, "Profile updated successfully")
        return redirect("useradmin:user_profile_update")

    context = {
        "profile": profile
    }
    return render(request, 'useradmin/userprofile.html', context)

urls.py:

path('user_profile_update/', views.user_profile_update, name='user_profile_update'),
path('user_list/', views.user_list, name='user_list'),

user_list.html:

{% extends 'useradmin/base.html' %}

{% block content %}
  <h1>User List</h1>
  <ul>
    {% for user in users %}
      <li>
        {{ user.email }} ({{ user.first_name }} {{ user.last_name }})
        <a href="{% url 'useradmin:user_profile_update' %}">View/Update</a>
      </li>
    {% empty %}
      <li>No users found.</li>
    {% endfor %}
  </ul>
{% endblock %}

userprofile.html:

Когда я перехожу по URL-адресу user_profile_update, я могу видеть и обновлять профиль только вошедшего в систему пользователя. Я хочу отобразить список пользователей и позволить обновлять их профили по отдельности.

Что я пробовал: 1.Обновил представление user_profile_update, чтобы оно принимало user_id. 2.Изменил шаблоны URL для передачи user_id. 3.Обновлен шаблон списка пользователей со ссылками на страницу обновления профиля для каждого пользователя.

Ожидаемый результат: Когда я нажимаю кнопку "Просмотр" на странице списка пользователей, я должен быть направлен на форму обновления для этого конкретного пользователя.

Фактический результат: Только форма профиля вошедшего пользователя отображается для обновления.

Дополнительная информация: Версия Django: 3.x Версия Python: 3.x Любые другие необходимые конфигурации или настройки

Что я упускаю или делаю неправильно? Любая помощь будет оценена по достоинству!

Проблема в том, что вы читаете логин пользователя в user_profile_update

profile = Profile.objects.get(user_name=request.user)

Для решения проблемы необходимо отправить id пользователя со страницы user_list и прочитать его в user_profile_update. Измените ваш код следующим образом.

в файле views.py:

def user_profile_update(request, pk):
    try:
        profile = Profile.objects.get(user_id=pk)

в urls.py:

path('user_profile_update/<int:pk>/', views.user_profile_update, name='user_profile_update'),

в файле user_list.html:

{% extends 'useradmin/base.html' %}

{% block content %}
  <h1>User List</h1>
  <ul>
    {% for user in users %}
      <li>
        {{ user.email }} ({{ user.first_name }} {{ user.last_name }})
        <a href="{% url 'useradmin:user_profile_update' user.id %}">View/Update</a>
      </li>
    {% empty %}
      <li>No users found.</li>
    {% endfor %}
  </ul>
{% endblock %}
Вернуться на верх