Re: making some generic views more generic
Sorry, here is an example of item_list urlpatterns = patterns('', (r'^products/$', item_list,{ 'template_object_name' : 'product', 'queryset' : Product.objects.all() }), (r'^products/(?P\d+)/$', item_list,{ 'template_object_name' : 'product', 'queryset' : Product.objects.all() }), (r'^products/(?P[\w-]+)/$', views.item_list,{ 'template_object_name' : 'product', 'queryset' : Product.objects.all() }), ) On Jan 6, 2:43 pm, cipher <cipherz...@gmail.com> wrote: > I also would like to request another view. > > def item_list(request,queryset,extra_context={}, > item_template=None,template_name=None, > > template_object_name='object',template_content_name='items', > page=None,paginate_by=None, > mimetype=None,allow_empty=True, > template_loader=loader,context_processors=None, > **filters): > queryset = queryset._clone() > if filters: > for k,v in filters.items(): > if k.startswith('_'): > del filters[k] > filters[k[1:]]=v > queryset=queryset.filter(**filters) > > if paginate_by: > paginator = Paginator(queryset, paginate_by, > allow_empty_first_page=allow_empty) > if not page: > page = request.GET.get('page', 1) > try: > page_number = int(page) > except ValueError: > if page == 'last': > page_number = paginator.num_pages > else: > # Page is not 'last', nor can it be converted > to an int. > raise Http404 > try: > page_obj = paginator.page(page_number) > except InvalidPage: > raise Http404 > > c = RequestContext(request, { > '{0}_list'.format(template_object_name): > page_obj.object_list, > 'paginator': paginator, > 'page': page_obj, > 'results_per_page': paginator.per_page, > 'pages': paginator.num_pages, > 'hits': paginator.count, > 'page_range': paginator.page_range, > }, context_processors) > queryset=page_obj.object_list > else: > c = RequestContext(request, { > '%s_list' % template_object_name: queryset, > 'paginator': None, > 'page_obj': None, > 'is_paginated': False, > }, context_processors) > if not allow_empty and len(queryset) == 0: > raise Http404 > for key, value in extra_context.items(): > if callable(value): > c[key] = value() > else: > c[key] = value > > modelMeta=queryset.model()._meta > directory,name=modelMeta.app_label,modelMeta.object_name.lower() > > if item_template is None: > item_template='{0}/{1}_list_item.html'.format(directory,name) > if template_name is None: > template_name='{0}/{1}_list.html'.format(directory,name) > item_template = template_loader.get_template(item_template) > responses=[] > c.push() > for item in queryset: > c[template_object_name]=item > item_result=item_template.render(c) > responses.append(item_result) > c.pop() > template=template_loader.get_template(template_name) > c[template_content_name]=mark_safe(''.join(responses)) > return HttpResponse(template.render(c), mimetype=mimetype) > > basically that will take keyword args and filter based on them like > Gabes methods, > but it also abstracts the item template in to another file. > > On Jan 6, 11:01 am, Gabe <gget...@gmail.com> wrote: > > > Hello, > > > I really like the generic view feature of Django. It's been a handy > > way to save a lot of work. Lately though, I've been finding myself > > often wanting to display a list of ob
Re: making some generic views more generic
I also would like to request another view. def item_list(request,queryset,extra_context={}, item_template=None,template_name=None, template_object_name='object',template_content_name='items', page=None,paginate_by=None, mimetype=None,allow_empty=True, template_loader=loader,context_processors=None, **filters): queryset = queryset._clone() if filters: for k,v in filters.items(): if k.startswith('_'): del filters[k] filters[k[1:]]=v queryset=queryset.filter(**filters) if paginate_by: paginator = Paginator(queryset, paginate_by, allow_empty_first_page=allow_empty) if not page: page = request.GET.get('page', 1) try: page_number = int(page) except ValueError: if page == 'last': page_number = paginator.num_pages else: # Page is not 'last', nor can it be converted to an int. raise Http404 try: page_obj = paginator.page(page_number) except InvalidPage: raise Http404 c = RequestContext(request, { '{0}_list'.format(template_object_name): page_obj.object_list, 'paginator': paginator, 'page': page_obj, 'results_per_page': paginator.per_page, 'pages': paginator.num_pages, 'hits': paginator.count, 'page_range': paginator.page_range, }, context_processors) queryset=page_obj.object_list else: c = RequestContext(request, { '%s_list' % template_object_name: queryset, 'paginator': None, 'page_obj': None, 'is_paginated': False, }, context_processors) if not allow_empty and len(queryset) == 0: raise Http404 for key, value in extra_context.items(): if callable(value): c[key] = value() else: c[key] = value modelMeta=queryset.model()._meta directory,name=modelMeta.app_label,modelMeta.object_name.lower() if item_template is None: item_template='{0}/{1}_list_item.html'.format(directory,name) if template_name is None: template_name='{0}/{1}_list.html'.format(directory,name) item_template = template_loader.get_template(item_template) responses=[] c.push() for item in queryset: c[template_object_name]=item item_result=item_template.render(c) responses.append(item_result) c.pop() template=template_loader.get_template(template_name) c[template_content_name]=mark_safe(''.join(responses)) return HttpResponse(template.render(c), mimetype=mimetype) basically that will take keyword args and filter based on them like Gabes methods, but it also abstracts the item template in to another file. On Jan 6, 11:01 am, Gabewrote: > Hello, > > I really like the generic view feature of Django. It's been a handy > way to save a lot of work. Lately though, I've been finding myself > often wanting to display a list of objects filtered by some field. The > documentation suggests handling this by writing a small view that > filters the objects and then calling the generic view from within > that. This works fine of course, but it seems that in a lot of cases > one can end up writing a large number of small views that all simply > display a filtered list of objects. I figured it might be helpful to > abstract this behavior into a couple of additional generic > views. These will automatically filter based on a keyword captured in > the URL and a field specified in the urls.py file. I've called these > new views object_list_field and object_list_foreign_field. They are > included below: > > def object_list_field(request, model, field, value, paginate_by=None, > page=None, > fv_dict=None, allow_empty=True, > template_name=None, > template_loader=loader, extra_context=None, > context_processors=None, > template_object_name='object', mimetype=None): > """Extends generic view object_list to display a list of objects > filtered > by an arbitrary field. > Works only for