自定义Django管理员建议

时间:2014-02-04 17:42:17

标签: python django

我需要运行一系列过滤器然后我希望能够循环结果。我正在考虑从一个表单开始,我可以选择过滤器选项。我在循环时需要下一个/上一个按钮。

我该如何实现?我只是寻找高级别的建议和示例代码(如果有的话)。

我知道我可以在AdminSite中设置index_template来创建第一页。我知道有SimpleListFilter,但我认为我不能使用它,因为我想要多个需要配置的过滤器。此外,我不想选择所有模型来循环它们。我打算编写自定义添加/更改视图。

我不确定如何从选定的过滤器选项转到每个所选模型的循环。我不确定是否可以传递和存储查询集,以便我循环访问每个模型。我想到的一些选项是将过滤器参数存储在url和当前的型号中。我想到的另一件事是将结果存储在数据库中并重新调用它。

更新 有人认为这太宽泛了,所以我会更具体一点。我认为最好的解决方案是从AdminSite继承并将index_template覆盖为包含过滤器的表单。如何将表单提交链接到将循环访问项目的视图?我假设我需要向管理员添加自定义视图,但我不确定如何将数据传递给视图。

1 个答案:

答案 0 :(得分:1)

这是一个相当广泛的问题,但我会试一试。

有几种方法可以实现这一目标:

使用过滤查询作为变量设置模型。

模型:

class Filter(models.Model):
    Filter_Query = models.CharField(max_length=30)

的观点:

from app_name.models import Filter, Some_Model

def filter(request, pk):
  template = loader.get_template("app_name/filter_search.html")
  filter_1 = Filter.objects.get(id=pk)  
  some_model = Some_Model.objects.all() 
  filter_1_search =  model_name.filter(some_option=filter_1)  
  context = RequestContext(request, {'filter_1_search': filter_1_search})
    return HttpResponse(template.render(context))

然后在单独的页面中,您可以加载结果。

{$("#some_div").load(filter/1)

甚至更容易,您可以使用AJAX发送您想要的任何过滤器查询。

的观点:

from app_name.models import Some_Model

def filter_query(request):
  filter_1 = request.GET.get('filter_query', '')# Receives from AJAX
  some_model = Some_Model.objects.all() 
  filter_1_search =  model_name.filter(some_option=filter_1)  
  jsonDump = json.dumps(str(filter_1_search))
     return HttpResponse(jsonDump, content_type='application/json') 

的javascript:

var data_JSON_Request = {'filter_query': filter_search1, 'csrfmiddlewaretoken': "{{csrf_token}}"};//JSON package.

function ajax_call(data_JSON_Request){
  $(function jQuery_AJAX(){
    $.ajax({
      type: 'GET',
      url: '/filter_query/',
      data: data_JSON_Request,
      datatype: "json",
      success: function(data) {$("#sove_div").load(data);
            open_model_menu();
      },//success
      error: function() {alert("failed...");}
    });//.ajax
  });//jQuery_AJAX
};//ajax_call