1

我可能在这一切都错了,所以我需要一些指导。我正在使用mention.js我正在构建的应用程序中链接帖子中的个人资料。使用硬编码数据进行这项工作是微不足道的。只需按照文档中的说明进行设置。

好吧,对于我的应用程序,每个登录的用户都属于一个组织,这个组织来自 Django 作为 JSON。我想mention.js用这些数据填充下拉列表,以便在用户输入时显示他们的组织列表。我已将 JSON 记录到终端控制台和浏览器控制台:

[
    {
        "fields": {
            "avatar": "images/avatars/bob.png", 
            "name": "Bob Jones"
    }, 
        "model": "accounts.profile", 
        "pk": 5
    }, 
    {
        "fields": {
            "avatar": "images/avatars/sam.png", 
            "name": "Sam Smith"
    }, 
        "model": "accounts.profile", 
        "pk": 7
    }
]

所以我从 Django 获得了正确的数据。我可以相对轻松地解析数据并打印到浏览器控制台:

console.log(profile_array[0].fields.name);

下一步是将其放入mention.js users参数中。根据@sainaen 的回答,我的 JavaScript 中有这个:

users: profile_array.map(function (profile) {
    return {
        username: profile.fields.name, // this still missing
        name: profile.fields.name,
        image: '/media/' + profile.fields.avatar
    };
})

问题是我的个人资料没有username字段。它通过关系链接到User模型。OneToOne所以在我看来,我实际上返回了两个 JSON 块:配置文件(fornameavatar)和用户(for username)。

我意识到我可以组合这些 JSON 对象,所以我这样做了。

但是现在我无法将参数 in取username出来。usersmention.js

更新

为了解决这个问题,我username在我的个人资料模型中添加了一个字段。save我在覆盖中添加了一些代码,以username将配置文件模型的自动填充为等于user.username. 不确定这是否是最好的方法,但它允许@sainaen 的答案起作用。

4

1 回答 1

2

从源头上看,mention.js它看起来users应该是 JS 对象的数组,所以数组中的任何函数都不起作用。还对username字段执行匹配,name仅用于显示结果。所以我认为你不仅应该设置name-s和avatar-s,还应该设置username-s。

理想情况下,如果您的用户 Django 模型将包含username,它将如下所示:

$("#some-field").mention({
    // other fields
    users: profile_array.map(function (profile) {
        return {
            username: profile.fields.username,
            name: profile.fields.name,
            avatar: profile.fields.avatar
        };
    })
 });

但是,当然,您可以在 JS 端自己将名称转换为用户名,例如:

// converts names into usernames
// ex: 'Bob Jones' -> 'bob_jones'
function nameToUsername(name) {
   return name.toLowerCase().replace(/\s+/g, '_');
}

然后在创建users数组的代码中使用它:

$("#some-field").mention({
    // other fields
    users: profile_array.map(function (profile) {
        return {
            username: nameToUsername(profile.fields.name),
            name: profile.fields.name,
            avatar: profile.fields.avatar
        };
    })
 });
于 2015-06-02T17:49:03.330 回答