Py学习  »  Django

求助。如何在模板中的一对多数据中过滤出想要的对象?

Hiro • 9 年前 • 5002 次点击  

Node 有一个外键关系为 members

from_node = models.ForeignKey(Node, related_name='members', null=True, blank=True)

平时在 views.py 中可以这样提取数据

node.members.filter(user_id=user.id)

请问在模板中该怎么 filter 出我想要的对象呢?

平时我在模板中需要全部数据的时候就直接用

{% for n in node.members.all %}

现在我只想要 user 为我指定的那个,请问怎么过滤呢?

谢谢大家了。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/743
 
5002 次点击  
文章 [ 6 ]  |  最新文章 9 年前
Hiro
Reply   •   1 楼
Hiro    9 年前

@greenpointan 十分感谢您的回复!!! 由于我的情况需要两个参数进行过滤,其中一个是当前的用户,就是 user。 我后来在 view 中进行了过滤操作,然后将得到结果存到字典里面传给模板了。

不过在模板中为了获取字典的 value 还是用到了自定义 filter。

greenpointan
Reply   •   2 楼
greenpointan    9 年前

我刚才尝试了一下,刚好对应你这种情况 定义一个自定义过滤器即可,定义过滤器以及过滤器的配置使用请看: https://docs.djangoproject.com/en/dev/howto/custom-template-tags/

我这里给一个简单的关于Topics(话题)对Group(小组)的例子:

from django import template

register = template.Library()

@register.filter(name='filtergroup'
def get_topics_by_group(value, arg):
    topics_list = value.filter(group=arg)
    return topics_list

前台使用:

topics_list|filtergroup:group.id

PS:

这样的方法仅仅对objects没有被切片的时候才能使用,如果你之前使用了切片那么就会无效
在django的项目中尽量不要再views里直接使用Models.objects.all(),这样做对服务器压力较大,好一点的做法是:Models.objects.filter(xxx)[0:x]

greenpointan
Reply   •   3 楼
greenpointan    9 年前

Custom template filters
自定义标签过滤
这应该是一个比较干净的解决办法了

Hiro
Reply   •   4 楼
Hiro    9 年前

@toozoofoo 请问怎么将user传入 model类里定义的函数中呢?

Hiro
Reply   •   5 楼
Hiro    9 年前

@toozoofoo 好吧,谢谢。

toozoofoo
Reply   •   6 楼
toozoofoo    9 年前

可以在Node的model类里定义一个函数实现你希望的功能,然后在模板里调用