[英]Generating a django HTML URL from a javascript function
我正在使用 Django 1.10.6 並嘗試從數據表中的 javascript 函數生成一個 url
在 url.py 下,我有一個名為 profile setup 的頁面,例如:
app_name = 'myapp'
urlpatterns = [
url(r'^profile/(?P<pk>[0-9]+)/$', views.ProfileView.as_view(), name='profile'),
]
在 javascript 中,我有一個 django 查詢將數據發送到一個變量,數據顯示在一個帶有 name 和 id 字段的表上:
var django_dat =[
{
"id": 1,
"name": "Jack Spicer",
},
{
"id":2,
"name": "Ted Cracker",
}
{
"id":3,
"name": "Justin Rollin",
}
{
"id":4,
"name": "Boaty Boat",
}
];
$(document).ready(function() {
var table = $('#dattable').DataTable({
data: django_dat,
columns: [{
'data': null,
'render': function(data, type, row, meta) {
//Django URL
return '<a href={% url 'myapp:profile' 2 %}>' + data.name + '</a>';}},
{
data: 'id'
}]
});
});
我正在嘗試更改 URL,以便將名稱鏈接到像 {% url 'myapp:profile' data.id %} 這樣的 url。 上面的代碼被硬編碼為 id=2 並且有效。
嘗試將其更改為:
return '<a href={% url 'myapp:profile' '+ data.id+ ' %}>' + data.name + '</a>'
但這給出了一個 No Reverse match error Reverse for 'profile' with arguments '('+ data.id+ ',)' and keyword arguments '{}' not found. 1 pattern(s) tried: ['profile/(?P<pk>[0-9]+)/$']
Reverse for 'profile' with arguments '('+ data.id+ ',)' and keyword arguments '{}' not found. 1 pattern(s) tried: ['profile/(?P<pk>[0-9]+)/$']
還嘗試使用替換功能:
return '<a href={% url 'myapp:profile' uid %}>'.replace('uid', data.id) + data.name + '</a>'
但得到了同樣的錯誤
這不是技術問題,而是理解 Django 和 JavaScript 中 url 如何工作的問題。 請記住,模板 html 文件首先由 Django 解析和呈現。 Django 不關心 JavaScript 語法——它只是將其視為更多的文本。 一旦頁面被呈現,它就會被發送到瀏覽器,在那里它被解釋並運行 JavaScript。 當這個過程進行時,Django 完全不在畫面中。 瀏覽器永遠不會看到 Django 模板標簽。 所以這個過程有兩個不同的階段 - Django 模板渲染,然后是在瀏覽器中運行的 JavaScript。
當您使用 Django {% url %}
標簽時,您是在要求 Django 解析和呈現一個 URL,它將使用其內置的 URL 解析器查找該 URL。 您的profile
url 需要一個 id 變量,您收到的錯誤消息告訴您 Django 正在嘗試使用您提供的變量解析 url,但未能解析該 url - 這看起來是一個 JavaScript 字符串連接。 同樣,Django 不理解 JS,所以你實際上給了它一堆垃圾字符。
所以,讓你的{% url %}
標簽工作的唯一方法是給它一個真實的用戶 ID,這是 Django 查找相關 URL 所需的。 但是在您的情況下,在您在 JavaScript 中選擇用戶之前,Django 不會知道該用戶 ID 是什么。
在 JavaScript 中獲取有效 url 的一些可能方法是:
get_profile_url_for_user
(或其他)API 端點,在 JS 中選擇用戶時,ajax 請求會與該用戶 ID 一起發送到通用 url,該 url 將在 Django 中進行 url 解析並返回該用戶個人資料的特定 url。 如果頁面上可能有數百個用戶,這將是我的首選方法。編輯 - 3 年后回到這個話題 - 我想我在此期間學到了一些東西! 還有第四個選項看起來好多了: 4. 假設您的用戶數據列表首先來自您的 Django 應用程序 - 您可以在該對象中包含每個用戶的個人資料 url,方法是在 Django 應用程序中的任何位置反轉 url用戶正在被序列化為 JSON。
{
"id":4,
"name": "Boaty Boat",
"profile_url": "http://django-host/profile/4"
}
如果我理解正確,我想你可能只想這樣做:
return "<a href={% url 'myapp:profile' " + data.id + ' %}>' + data.name + '</a>'
在您當前的表單中, myapp:profile
將被解釋為 javascript 變量,因為您由於嵌套的單引號(並且它不是有效的 javascript 變量名稱)而未引用。
所以我嘗試了兩種使用 JavaScript 函數生成 URL 的解決方案:
function linkgen(app_page, link_id, display_txt){
let tag_head ="<a href={% url '",
tag_head2 =" %}>",
tag_tail ='</a>'
return tag_head.concat(app_page,"' ", link_id, tag_head2, display_txt, tag_tail )
}
function hardgen(app_page, link_id, display_txt){
let tag_head ="<a href='http://localhost:8000/",
tag_head2 ="/'>",
tag_tail ='</a>'
return tag_head.concat(app_page,"/", link_id, tag_head2, display_txt, tag_tail )
}
第一個生成 Django 樣式 {% URL link %} 第二個生成硬 http:// 鏈接。 硬鏈接工作正常。 但是你在做生產的時候一定要修改base url。
return hardgen('profile', data.id, data.name)
但是 django 生成的鏈接做了一些有趣的事情。
{ data: null, "render": function(data, type, row, meta) {
console.log(linkgen('myapp:profile', data.id, data.name))
return linkgen('myapp:profile', data.id, data.name)
; }},
如果您將其粘貼到返回中,控制台日志將返回正確的鏈接,它將起作用,但由於 django 的設置方式,生成的字符串不會。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.