2017-05-19 56 views
0

生成HTML的Django URL我使用Django 1.10.6,並試圖產生從數據表從javascript函數

下url.py一個JavaScript函數的網址我有一個叫做頁面的個人資料設置,如:

app_name = 'myapp' 

urlpatterns = [ 
    url(r'^profile/(?P<pk>[0-9]+)/$', views.ProfileView.as_view(), name='profile'), 
] 

在javascript中我有一個Django的查詢數據發送到一個變量,數據顯示在與名稱和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 s o將名稱鏈接到像{%url'myapp:profile'data.id%}這樣的網址。上面的代碼被硬編碼爲id = 2並且可以工作。

試過更改爲:

return '<a href={% url 'myapp:profile' '+ data.id+ ' %}>' + data.name + '</a>' 

但是,這給了一個無反向匹配錯誤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>' 

,但得到了同樣的錯誤

回答

0

這不是一個技術問題,而是你的一個問題了解如何在Django和JavaScript中工作。請記住,模板html文件首先由Django進行解析和呈現。 Django不關心JavaScript語法 - 它只是將其視爲更多文本。一旦頁面被渲染,它就會被髮送到瀏覽器並在其中進行解釋並運行JavaScript。而當這個過程正在進行時,Django完全不在場。瀏覽器永遠不會看到Django模板標籤。所以這個過程有兩個截然不同的階段 - Django模板渲染,接着是在瀏覽器中運行的JavaScript。

當您使用Django {% url %}標記時,您要求Django解析並呈現它將使用其內置的URL解析器查找的URL。你的profile url需要一個id變量,並且你得到的錯誤信息告訴你Django正在嘗試並且無法用你給它的變量來解析url - 這看起來是一個JavaScript字符串連接。同樣,Django不理解JS,所以你實際上給了它一堆垃圾字符。

因此,讓{% url %}標籤正常工作的唯一方法是給它一個真正的用戶ID,這是Django需要查找相關URL的內容。但在你的情況下,Django將不知道該用戶標識是什麼,直到你選擇JavaScript中的用戶。

一些可能的方式來獲得一個有效的URL在JavaScript是:

  1. 動態構建它(使用硬編碼的URL模式的字符串連接)。你用這種方法失去了可維護性,但它會是最快實施的。如果你將來改變你的網址結構,你必須記得在這裏回來修改它。
  2. 最初從Django提供有效的URL列表,然後在選擇用戶時從該列表中選擇。如果您的用戶列表很小並且可以避免硬編碼url的問題,這將是一個很好的解決方案。
  3. 要有一個get_profile_url_for_user(或其他)的API端點,在JS中選擇一個用戶,一個AJAX請求與該用戶ID一起發送到一個通用的URL,它將在Django中執行URL解析並返回特定的URL用戶的個人資料。如果您的頁面上有數百個用戶,這將是我首選的方法。
+0

我想我被卡住了選項1,謝謝 – ccsv

0

如果我理解這個權利,我想你可能只是想做到這一點:

return "<a href={% url 'myapp:profile' " + data.id + ' %}>' + data.name + '</a>' 

在當前的形式,myapp:profile將被解釋爲一個JavaScript變量,因爲你由於unquoting你嵌套的單引號(它不是一個有效的JavaScript變量名稱)。

+0

除非你給'url'標記一個有效的用戶ID作爲參數在Python中,它會失敗。引號沒有什麼區別,事實上,正確的語法不會在變量周圍使用任何引號 - 如果數據是python對象,它只是'{%url'myapp:profile'data.id%}'。 – ChidG

+0

@P阿克曼忘了提及我也試過,並得到一個錯誤'無法解析餘數:''''''''''' – ccsv

+0

哦,那麼你可能只需要生成URL路徑,因爲它將用於瀏覽器,而不是這個Django字符串插值模式。 –

0

所以,我試圖用於使用JavaScript函數的URL 2級的解決方案:

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鏈接%}的第二生成硬的http://鏈接。硬鏈接工作正常。但是你必須確保在生產時更改基礎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是如何建立正確的鏈接。