0

对于我的一个模型,我想在 change_form 中显示额外的内容。基本上,我的模型如下所示:

class News(models.Model):
    ...

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

我想添加一个“搜索”按钮,单击该按钮会触发对外部新闻源的 Web 服务请求,下拉可用内容,并列出包含的所有新闻。然后,用户可以选择其中一个“附加”到管理界面中当前编辑的新闻(即基于通过网络服务下载的内容创建一个新的 NewsFromSource)。

我完成了网络服务。实现搜索按钮、结果列表显示(我有一个可以工作的视图和模板,需要以某种方式将它们放入表单)和保存部分的最佳方法是什么?

4

2 回答 2

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)我映射了视图:

#/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”的方式提出建议。

于 2012-03-09T12:19:16.597 回答
0
  1. 我们假设您有一个相关的 News 模型。将该字段添加到我们要破解的 modeladmin 的 raw_id_fields 中,然后

  2. 重载这个模型的change_form模板admin/change_form.html,扩展admin/yourapp/yourmodel/change_form.html

  3. 在该模板中添加 javascript到:

    1. 从原始新闻 id 字段表单中隐藏输入和放大镜图标,您也可以在 css 中执行此操作

    2. 在该表单行中添加带有按钮样式的跨度之类的内容,单击它时会打开一个弹出窗口

    3. 它应该打开的弹出窗口应该是您的工作视图/模板,其中包含用于选择新闻的表单

    4. 当用户选择新闻时,弹出窗口应该做一个 ajax post 请求来获取新闻 id,并关闭自己

    5. 该值设置为隐藏的原始 id 字段输入,这非常困难,但不要担心有人(免责声明:我)发表了一篇包含整个技术细节的文章,也找到了另一篇但我没有测试它

这将是相当多的工作。耐心和毅力将是您完成这项任务的最佳品质 B)

于 2012-03-08T15:39:12.977 回答