Django:管理员表单中的自定义内容

时间:2012-03-08 14:55:16

标签: django django-forms django-admin django-widget

对于我的某个模型,我想在change_form中显示额外的内容。基本上,我的模型看起来像这样:

class News(models.Model):
    ...

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

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

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

2 个答案:

答案 0 :(得分: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”方式这样做的建议。

答案 1 :(得分:0)

  1. 我们假设您有相关新闻模型。将该字段添加到我们要破解的modeladmin的 raw_id_fields ,然后:

  2. 重载此模型的change_form模板,在admin/change_form.html

  3. 中展开admin/yourapp/yourmodel/change_form.html
  4. 将该模板中的javascript 添加到:

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

    2. 在该表单行中添加类似带有按钮样式的span的内容,单击该行时将打开一个弹出窗口

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

    4. 当用户选择新闻时,弹出窗口应该发出ajax post请求以获取新闻ID,并自行关闭

    5. 将值设置为隐藏的原始id字段输入,这非常困难,但不要害怕某人(disclamer:I)发布an article with the whole technical details,也发现another one but I didn't test it

  5. 这将是一些相当的工作。耐心和毅力将是你完成这项任务的最佳品质B)