2012-03-08 53 views
0

對於我的一個模型,我想在change_form中顯示額外的內容。基本上,我的模型是這樣的:Django:以管理員的形式定製內容

class News(models.Model): 
    ... 

class NewsFromSource(models.Model): 
    news     = models.ForeignKey(News) 
    ... 

我想添加一個「搜索」按鈕,點擊後會觸發一個Web服務請求外部新聞源,拉低可用的內容,並列出所有包含的新聞片段。用戶然後可以選擇其中的一個片段以「附加」到管理界面中當前編輯的新聞(即,基於通過web服務下載的內容創建新的NewsFromSource)。

我完成了網絡服務。什麼是實現搜索按鈕,列表顯示結果(我有一個視圖和模板的工作,需要將這些表單以某種方式)和保存部分的最佳方法?

回答

1

我落得這樣做是:

1)

我創造了獲取搜索結果的看法,這歸結爲:

#/myproject/admin/views.py 
@never_cache 
def news_search(request): 

    #...query web service 
    if 'q' in request.POST: 
     search_term = request.POST['q'] 
    else: 
     search_term = '' 

    news = NewsSearch() 
    news.search(search_term) 

    return render_to_response( 'news_search_results.html', 
          { 'q':   search_term, 
           'news':  news.result_list, 
           'page':   page, 
           'page_left': news.page_left, 
           'page_right': news.page_right} 
           ) 

2)I映射視圖:

#/myapp/urls.py 
... 
url(r'^myapp/news/search/$', views.news_search), 

3)我擴展了change_form。HTML的新聞模型下面的代碼:

#/myproject/templates/admin/myapp/news/change_form.html 
    {% extends "admin/change_form.html" %} 
    {% block after_field_sets %} 
    ... 
    {% csrf_token %} 
    <input type="text" name="q" id="news-search-term"> 
    <div id="news-search-results"></div> 
    ... 
    function submitSearchForm() { 
    $.post("/myapp/news/search/", 
     { 'q': $('#news-search-term').val(), 
      'csrfmiddlewaretoken': $('input[name=csrfmiddlewaretoken]').val() }, 
     function(data){ 
      $('#news-search-results').html(data); 
     } 
    ); 
} 
    {{ block.super }} 
    {% endblock %} 

4)我創建的HTML模板顯示結果(news_search_results.html,參見圖1)

所以基本上我從Ajax請求管理頁面到自定義視圖來檢索web服務的結果,然後顯示在div中。

結果列表中的每個元素都有一個按鈕,用於發送另一個請求,該請求將具有新聞ID的元素存儲爲ForeignKey。

我不知道這是否特別針對Django原則。但它似乎工作正常。

建議以更「Djangonian」的方式做到這一點是值得歡迎的。

0
  1. 我們假設你有相關新聞模型。該字段添加到raw_id_fields我們要破解的ModelAdmin,那麼

  2. 超載的change_form模板,這種模式,在admin/yourapp/yourmodel/change_form.html

  3. 延長admin/change_form.html添加JavaScript在該模板到:

    1. 隱藏輸入和放大鏡圖標從新聞原始ID字段形式原始,你能做到這一點在CSS太

    2. 添加類似與形式排點擊

    3. 應該打開應該是你的工作視圖/模板彈出時,它會打開一個彈出式的按鈕樣式的跨度用形式來選擇新聞

    4. 當用戶選擇了一個新聞,在彈出的應該做一個ajax post請求得到的消息ID,並關閉自身

    5. 的值設置爲原料id字段隱藏的輸入,這是非常艱難的,但不怕別人(d isclamer:我)公佈an article with the whole technical details,還發現another one but I didn't test it

這將是相當一些工作。耐心和毅力將是這一使命B您最好的品質)

+0

對不起,我只是想出了彈出將無法「返回」JSON很容易,所以我改變了我的建議 – jpic 2012-03-08 16:00:31

+0

我無法訪問鏈接... – Yann 2012-03-08 16:12:58

+0

感謝您的反饋意見,事實證明,我有一個破解我的主機文件...更新了鏈接 – jpic 2012-03-08 16:23:03