我有一个显示在如下模板中的用户列表。
{% for u in users_list %}
{{u.name}}
{% endif %}
如果我愿意,是否可以将两个或多个用户排在顶部?
例如,有一个用户,当当前用户访问该列表时,可以在将变量发送到模板之前排除我,从而将他排名在前,而无需进行特定排序。
1) me
2) user2
3) user3
答案 0 :(得分:3)
如果要在查询集的顶部按ID排序特定的对象,则可以在conditional expression上排序-例如,将当前用户放在顶部,并按名称对其他用户排序:< / p>
from django.db.models import Case, When
from django.contrib.auth.models import User
users = User.objects.order_by(
Case(When(id=request.user.id, then=0), default=1),
'last_name',
'first_name'
)
要在顶部放置多个对象,只需调整When
条件:
ids_at_top = [1, 2]
users = User.objects.order_by(
Case(When(id__in=ids_at_top, then=0), default=1))
我还会考虑是否可以通过更简单的方式实现您想要的目标-例如,您可以获取当前用户,将其从主查询集中排除,然后像这样单独显示在模板中
# in the view
current_user = request.user
users = User.objects.exclude(id=current_user.id)
# in the template
{{ current_user.name }}
{% for u in users %}
{{ u.name }}
{% endif %}
答案 1 :(得分:1)
在您的视图中,创建要显示的用户列表。为了显示当前用户,您可以使用regex_replace
获取当前用户并将其附加到列表中,然后再添加其余用户。在您的模板中,您会这样做
- hosts: all
gather_facts: no
vars:
class_names:
- 'App\ElasticSearch\Configurators\UserConfigurator'
- 'App\ElasticSearch\Configurators\ClientConfigurator'
tasks:
- set_fact:
index_names: >-
[
{% for cn in class_names -%}
{{ '' if loop.first else ',' }}
{{ cn |
regex_replace(".*\\([^\\]+$)", "\1") |
regex_replace("([A-Z])([a-z])", "\x00\1\2") |
lower | replace("\x00", "_") | regex_replace("^_", "") |
to_json }}
{% endfor %}
]
with_items: '{{ class_names }}'
- debug: var=index_names verbosity=0
- debug: var=item verbosity=0
with_items: '{{ index_names }}'
应该找到您想要的东西
TASK [debug] *******************************************************************
ok: [localhost] => (item=user_configurator) => {
"item": "user_configurator"
}
ok: [localhost] => (item=client_configurator) => {
"item": "client_configurator"
}
如果您想吸引其他人,您只需使用
request.user
答案 2 :(得分:0)
分配查询集,您可以根据用户中的字段订购users_list
。为此,您在查询集中具有sort
方法。在我看来,您需要添加一个字段,以便可以对该字段进行排序。例如,您添加一个默认为0的等级字段,然后添加最高等级的值。
完整的示例在这里定义:https://docs.djangoproject.com/en/2.1/topics/auth/customizing/#a-full-example
在您的CustomUserMdel
中添加一个字段rank = models.IntegerField(default=0)
然后在您的视图中,您需要按等级排序:
from django.contrib.auth import get_user_model
User = get_user_model()
# in your view...
user_list = User.objects.all().sort_by('rank')