将 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 的两个块:个人资料(对于 name
和 avatar
)和用户(对于 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
};
})
});
我可能做错了,所以我需要一些指导。我正在使用 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 的两个块:个人资料(对于 name
和 avatar
)和用户(对于 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
};
})
});