重定向到用户个人资料详细信息不正确

时间:2020-05-02 16:13:05

标签: python django django-views django-templates

如果用户是工作人员,则除其个人资料详细信息外,他还将看到用户列表及其个人详细信息。如果没有,他只会看到他的个人资料详细信息。

models.py

class UserProfile(AbstractUser):

    def __str__(self):
        return self.username

    def get_absolute_url(self):
        return reverse("user_details", kwargs={"username":self.username})

views.py

def usersList(request):
    """
    The list of all users
    """
    if request.user.is_superuser:
        users_list = UserProfile.objects.all()
    elif request.user.is_staff:
        users_list = UserProfile.objects.filter(is_staff=False)
    else:
        raise PermissionDenied
    template = 'usermanager/users_list.html'
    context = {
        'users': users_list,
    }
    return render(request, template, context)

def userDetails(request, username):
    """
    User details
    """
    user_details = get_object_or_404(UserProfile, username=username)

    template = 'usermanager/user_details.html'
    context = {
        'user_details': user_details,
    }
    return render(request, template, context)

urls.py

path('user-list/', views.usersList, name='users'),
path('<username>/', views.userDetails, name='user_details'),

users_list.html

  {% for user in users %}
  <h1>{{ user.username }}</h1>
  <p>Name: {{ user.first_name }}</p>
  <p>Surname: {{ user.last_name }}</p>
  <p>Email: {{ user.email }}</p>
  {% if request.user.is_superuser %}
    {% if user.is_staff %}
    <button class="btn btn-warning">Staff</button>
    {% else %}
    <button class="btn btn-primary">User</button>
    {% endif %}
  {% endif %}
  <a class="btn btn-danger" href="{% url 'user_details' username=user.username %}">Details</a>
  <hr>
  {% endfor %}

user_details.html

{% if request.user == user %}
<h1>Your profile</h1>
{% else %}
<h1>Profile of {{ user.username }}</h1>
{% endif %}
<hr>
<div class="container">
  <p>Name: {{ user.first_name }}</p>
  <p>Surname: {{ user.last_name }}</p>
  <p>Email: {{ user.email }}</p>
  {% if request.user.is_superuser %}
    {% if user.is_staff %}
    <button class="btn btn-warning">Staff</button>
    {% else %}
    <button class="btn btn-primary">User</button>
    {% endif %}
  {% endif %}
  <p>Joined: {{ user.date_joined }}</p>
  <p>Last login: {{ user.last_login }}</p>
  {% if user.is_active %}
  <button class="btn btn-success">Active</button>
  {% else %}
  <button class="btn btn-secondary">Inactive</button>
  {% endif %}
</div>

我可以正确看到所有用户的列表。 Bob 是我的用户之一,如果我单击他的详细信息,则会看到我的个人资料。所有用户的详细信息都会发生这种情况,我总是看到我的个人资料。我以超级用户身份登录。

我怎么了?

2 个答案:

答案 0 :(得分:1)

您用于user_Details的对象是{{user_details}},因此您应该将其用作模板上的变量:

{% if request.user == user_details %}等。那应该可以解决您的问题。

但是正如here in the docs所述,Django已经使用模板变量user来让您看到实际的用户信息。

在用户列表模板中,您没有此问题,因为您正在用user覆盖for变量。

另一个建议是:避免在模板上覆盖user变量。例如在您的users_list上:

{% for usr in users %}
    <h1>{{ usr.username }}</h1>
    <p>Name: {{ usr.first_name }}</p>
    <p>Surname: {{ usr.last_name }}</p>
    <p>Email: {{ usr.email }}</p>
    {% if request.user.is_superuser %}
      {% if usr.is_staff %}
      <button class="btn btn-warning">Staff</button>
      {% else %}
      <button class="btn btn-primary">User</button>
      {% endif %}
    {% endif %}
    <a class="btn btn-danger" href="{% url 'user_details' username=usr.username %}">Details</a>
    <hr>
    {% endfor %}

答案 1 :(得分:0)

这是我的愚蠢错误... #include<stdio.h> int main() { FILE *fp; char c; fp=fopen("random","w"); while((c=getchar())!=EOF) { putc(c,fp); } printf("no of character entered = %ld\n",ftell(fp)); fclose(fp); } 的顶点是userDetails,但我在模板内使用了user_details