【问题标题】:How to make groups of all the Customers, Admins and Staff Members and render accordingly in same template based on URL hit?如何根据 URL 命中将所有客户、管理员和员工分组并在同一模板中相应呈现?
【发布时间】:2019-12-19 23:17:45
【问题描述】:

我试图在同一个模板中显示所有客户、超级用户和员工。我怎样才能做到这一点?我有这样的运行代码


class GroupListView(UserPassesTestMixin, ListView):
    model = User
    template_name = 'admin_app/group_list.html'

    def get_context_data(self, *, object_list=None, **kwargs):
        context = super().get_context_data(**kwargs)
        group_name = (self.kwargs['group'])
        if group_name == 'admin':
            context['user_list']= User.objects.filter(is_superuser=True, is_staff=True)
        elif group_name == 'staff':
            context['user_list'] = User.objects.filter(is_staff=True)
        else:
            context['user_list'] = User.objects.filter(is_superuser=False, is_staff=False)
        return context

    def test_func(self):
        return self.request.user.is_superuser

产生命中的url是这样的

<a href="{% url 'admin:group_list' group='admin' %}"><i class="fa fa-adn"></i>Admin</a>

模板很大,所以没有必要发布。这正在产生结果,但有没有更好的方法来做到这一点?

如何创建组然后渲染数据?

注意- 我怎样才能创建一个链接和视图,以根据单击的链接对所有用户进行排序。 (在 Django-Admin 中也是如此)

【问题讨论】:

  • 我不确定你为什么认为你已经在做的事情有什么问题,尤其是考虑到它正在按你的意愿工作。您是否有某些具体原因不想这样做?
  • 看来工作量太大了。如果有很多组,代码会看起来很乱
  • 啊,所以您的意思是您将拥有更多的组,而不仅仅是管理员、员工和用户?
  • @urbanespaceman 是的!确切地。你能帮我解决这个使 url 参数成为可选/非捕获的问题吗?
  • @urbanespaceman ``` re_path(r'^users/(?:(?P))', views.UserListView.as_view(), name='user_list'), ``` 我怎样才能使这个 slug 参数可选/非捕获,以便是否存在 slug 无关紧要?

标签: django django-models django-templates django-views


【解决方案1】:

将用户分配给Groups 时,您可以创建任意数量的组。

如果您想为所有组动态创建 url 并显示属于该组的用户列表,您可以这样做:

创建网址: 例如,在您的 userListView 上将组添加到上下文中。然后在 get_queryset 方法中,您可以检查 kwarg 'group' 是否可用。如果可用,您可以根据它过滤查询集。

from django.contrib.auth.models import Group

class UsersListView(ListView):
model = User
template_name = 'user_list.html'

def get_context_data(self, *args, **kwargs):
    context = super().get_context_data(*args, **kwargs)
    context['groups'] = Group.objects.all()
    return context

def get_queryset(self):
    queryset = super().get_queryset()
    try:
        group = self.kwargs['group']
        queryset = queryset.filter(groups=group)
    except:
        pass
    return queryset

然后在您的模板中:

{% extends 'base.html' %}

{% block content %}

<div class="col-md-10">
    <table>
    {% for object in object_list %}
        <tr><td>{{ object }}</td></tr>
    {% endfor %}
    </table>
</div>
<div class="col-md-2">
    <table class="table">
      {% for group in groups %}
          <tr>
            <td><a href="{% url 'staff:user_list' group=group.id %}">{{ group }}</a></td>
          </tr>
        {% endfor %}
      </table>
</div>

{% endblock %}

在 urls.py 中,您可以将两条路线添加到同一个视图:

path('users/', views.UsersListView.as_view(), name='user_list'),
path('users/<group>/', views.UsersListView.as_view(), name='user_list'),

缩进有点不对劲,但你明白了。

【讨论】:

  • 仅供参考:您应该使用 cmets 来澄清问题,而不是将非答案作为答案...
  • 我知道。 “你必须有 50 声望才能发表评论”。
  • @Gijsthebookie 是的!我知道使用 GET 方法?但它不需要单独的网址吗?它会使网址看起来很乱。我也试过了。你能告诉我把 url 参数设为可选吗?
  • @Gijsthebookie ``` re_path(r'^users/(?:(?P))', views.UserListView.as_view(), name='user_list'), ``` 使 slug 字段可选?
  • 查看更新的答案。这就是你的意思,对吧?当然在这个例子中它使用了 django 组,而不是人员/超级用户/普通用户,因为你说你想创建很多组。
猜你喜欢
  • 2017-07-24
  • 2013-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-24
  • 2016-08-24
相关资源
最近更新 更多