2012-03-08 55 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