brian
brian

Reputation: 793

Customize Django Admin Advice

I have a series of filters I need to run and then I want the ability to loop though the results. I'm thinking of starting with a form where I can select the filter options. I want a next/previous buttons when I'm looping.

How would I implement this? I'm just looking for high level advice and sample code if available.

I know I can set index_template in AdminSite to create the first page. I know there is the SimpleListFilter but I don't think I can use it since I want multiple filters that need to be configured. Also I don't want to have to select all the models to loop though them. I plan on writing a custom add/change view.

I'm not sure how to go from the selected filter options to looping though each of the selected models. I'm not sure if I can pass and store a query set for when I loop though each model. Some of the options I've thought about is storing the filter parameters in the url and the current model number. Another thing I thought about is storing the results in database and recalling it.

Update Someone thought this was too broad so I'll be a little more specific. I think the best solution will be to inherit from AdminSite and overwrite index_template to be a form that will contain the filters. How would I link the form submit to a view that will loop though the items? I assume I'll need to add a custom view to the admin but I'm not sure how to pass the data to the view.

Upvotes: 0

Views: 97

Answers (1)

DGDD
DGDD

Reputation: 1390

This is quite a broad question but I'll give it a shot.

There are a few ways you can achieve this:

Setting up a model with filter queries as variables.

models:

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

views:

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))

Then in a separate page, you can load the results like so.

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

or even easier you can you can just use AJAX to send whatever filter query you want.

views:

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

Upvotes: 1

Related Questions