将 JSON 从 Django 转换为 JavaScript 数组并循环填充 'users' 中的参数 Mention.js

Convert JSON from Django to JavaScript Array and Loop to Populate 'users' Parameter in Mention.js

我可能做错了,所以我需要一些指导。我正在使用 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 字段。它通过 OneToOne 关系链接到 User 模型。所以在我看来,我实际上返回了 JSON 的两个块:个人资料(对于 nameavatar)和用户(对于 username)。

我意识到我可以 combine these JSON objects 所以我做到了。

但现在我无法为 mention.js 中的 users 参数获取 username

更新

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

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
        };
    })
 });