【问题标题】:eliminate duplicates in django消除django中的重复项
【发布时间】:2017-09-21 18:32:12
【问题描述】:

我正在尝试从 20 个数字的列表中选择 3 个随机数字。

在views.py中,我定义了这个变量:

nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]

在我的模板 index.html 中:

{{ nums|random }} - {{ nums|random }} - {{ nums|random }}

我想获得 3 个不同的数字,但我不知道要应用哪个过滤器/标签。

我已经尝试过 if/else 语句,for 循环,(如果有重复我想要重绘)但我对结果不满意,我很确定有一个简单的过滤器可以做到这一点。

【问题讨论】:

  • 您是否将nums 列表用于选择随机数以外的其他目的?如果没有,可以预先打乱 nums 列表,只选择前 3 个元素。
  • 我只使用列表来获取随机数

标签: django django-templates django-views django-queryset


【解决方案1】:

我认为使用内置过滤器没有合理的方法来做到这一点。我只需选择视图中的数字并将其传递给上下文。

如果您的渲染是一致的,并且您想在很多地方这样做,您可以编写自定义模板标签,例如:

import random
from django import template

register = template.Library()

@register.simple_tag
def random_sample(population, k):
    return ' - '.join(str(choice) for choice in random.sample(population, k))

然后在你的模板中{% random_sample nums 3 %}

但我认为在视图中这样做更简单。

【讨论】:

  • 感谢@PeterDeGlopper。我是 Django 新手,我确信这个解决方案对于我目前的水平来说太先进了。不过,我将阅读有关自定义标签的文档。知道我可以深入那个方向,这对我来说是件好事。
  • 它们是“我想做一些对于内置模板标签和过滤器来说太高级的事情”的一般答案之一。另一种是只在视图中做,然后将结果传递给模板。
  • 感谢一百万的反馈,我已阅读 django 文档以了解您对自定义模板标签的帮助。我不仅成功地使我的代码工作(添加了 init.py 文件,加载自定义标签等)而且,也许更重要的是,你让我意识到并理解了力量django的!我意识到我可以做的比我最初想象的要多得多。再次感谢!
【解决方案2】:

您可以使用此功能创建模板标签来解决您的问题。

yourapp/templatetags/custom_choice_tags.py

from django import template
import random

register = template.Library()

@register.assignment_tag
def get_three_unique_random_values_from_list(value_list):
    random_choices = random.sample(value_list, 3)
    selected_choices = {
        'first_choice': random_choices[0],
        'second_choice': random_choices[1],
        'third_choice': random_choices[2],
    }
    return selected_choices

然后在你的 template.html 中:

{% load custom_choice_tags %}

{% get_three_unique_random_values_from_list random_list  as random_choices %}

 {{ random_choices }} 

在本例中,变量 random_list 将从您的视图传递到模板上下文中。

【讨论】:

  • 只需使用 random.sample 而不是无限期的 while 循环,这就是它的用途。
  • 感谢@PeterDeGlopper 指出我以前不知道 random.sample!
  • 感谢@matyas 我感谢您的反馈。然后我会研究自定义标签解决方案。
猜你喜欢
  • 2023-03-10
  • 2020-02-27
  • 2018-08-07
  • 2011-05-03
  • 2012-04-22
  • 2019-04-08
  • 2017-05-29
  • 2022-11-22
  • 2021-11-22
相关资源
最近更新 更多