对于我的某个模型,我想在change_form中显示额外的内容。基本上,我的模型看起来像这样:
class News(models.Model):
...
class NewsFromSource(models.Model):
news = models.ForeignKey(News)
...
我想添加一个“搜索”按钮,当点击该按钮时,会触发对外部新闻源的Web服务请求,下拉可用内容,并列出包含的所有新闻。然后,用户可以选择其中一个片段以“附加”到当前在管理界面中编辑的新闻(即,根据通过Web服务下载的内容创建新的NewsFromSource)。
我已经完成了Web服务。实现搜索按钮的最佳方法是什么,结果的列表显示(我有一个工作的视图和模板,需要以某种方式将它们放入表单中)和保存部分?
答案 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)
我们假设您有相关新闻模型。将该字段添加到我们要破解的modeladmin的 raw_id_fields ,然后:
重载此模型的change_form模板,在admin/change_form.html
admin/yourapp/yourmodel/change_form.html
将该模板中的javascript 添加到:
隐藏新闻原始id字段表格中的输入和放大镜图标,你可以在css中执行此操作
在该表单行中添加类似带有按钮样式的span的内容,单击该行时将打开一个弹出窗口
它应该打开的弹出窗口应该是您的工作视图/模板,其中包含用于选择新闻的表单
当用户选择新闻时,弹出窗口应该发出ajax post请求以获取新闻ID,并自行关闭
将值设置为隐藏的原始id字段输入,这非常困难,但不要害怕某人(disclamer:I)发布an article with the whole technical details,也发现another one but I didn't test it
这将是一些相当的工作。耐心和毅力将是你完成这项任务的最佳品质B)