11from typing import TYPE_CHECKING
22
33from bolt .db import models
4+ from bolt .htmx .views import HTMXViewMixin
45from bolt .http import HttpResponse , HttpResponseRedirect
56from bolt .paginator import Paginator
67from bolt .urls import reverse
@@ -115,25 +116,28 @@ def render_card(self, card: "Card"):
115116 return card ().render (self .request )
116117
117118
118- class AdminListView (AdminView ):
119+ class AdminListView (HTMXViewMixin , AdminView ):
119120 template_name = "admin/list.html"
120121 fields : list [str ]
121122 actions : list [str ] = []
122123 filters : list [str ] = []
123124 page_size = 100
124125 show_search = False
126+ allow_global_search = False
125127
126128 def get_context (self ):
127129 context = super ().get_context ()
128130
129131 # Make this available on self for usage in get_objects and other methods
130132 self .filter = self .request .GET .get ("filter" , "" )
131133
132- objects = self .get_objects ()
134+ page_size = self .request .GET .get ("page_size" , self .page_size )
135+ paginator = Paginator (self .get_objects (), page_size )
136+ self ._page = paginator .get_page (self .request .GET .get ("page" , 1 ))
133137
134- context ["paginator" ] = Paginator ( objects , self . page_size )
135- context ["page" ] = context [ "paginator" ]. get_page ( self .request . GET . get ( "page" , 1 ))
136- context ["objects" ] = context [ "page" ] # alias
138+ context ["paginator" ] = paginator
139+ context ["page" ] = self ._page
140+ context ["objects" ] = self . _page # alias
137141 context ["fields" ] = self .get_fields ()
138142 context ["actions" ] = self .get_actions ()
139143 context ["filters" ] = self .get_filters ()
@@ -144,6 +148,8 @@ def get_context(self):
144148 context ["search_query" ] = self .request .GET .get ("search" , "" )
145149 context ["show_search" ] = self .show_search
146150
151+ context ["table_style" ] = getattr (self , "_table_style" , "default" )
152+
147153 context ["get_object_pk" ] = self .get_object_pk
148154 context ["get_object_field" ] = self .get_object_field
149155
@@ -153,6 +159,24 @@ def get_context(self):
153159
154160 return context
155161
162+ def get (self ) -> HttpResponse :
163+ if self .is_htmx_request :
164+ hx_from_this_page = self .request .path in self .request .headers .get (
165+ "HX-Current-Url" , ""
166+ )
167+ if not hx_from_this_page :
168+ self ._table_style = "simple"
169+ else :
170+ hx_from_this_page = False
171+
172+ response = super ().get ()
173+
174+ if self .is_htmx_request and not hx_from_this_page and not self ._page :
175+ # Don't render anything
176+ return HttpResponse (status = 204 )
177+
178+ return response
179+
156180 def post (self ) -> HttpResponse :
157181 # won't be "key" anymore, just list
158182 action_name = self .request .POST .get ("action_name" )
0 commit comments