models.py
class Lab(Model):
acronym = CharField(max_length=10)
class Message(Model):
lab = ForeignKey(Lab)
urls.py
urlpatterns = patterns('',
url(r'^(?P<lab>\w+)/$', ListView.as_view(
queryset=Message.objects.filter(lab__acronym='')
)),
)
I want to pass the lab
keyword argument to the ListView queryset. That means if lab
equals to TEST
, the resulting queryset will be Message.objects.filter(lab__acronym='TEST')
.
How can I do that?
You need to write your own view for that and then just override the get_queryset
method:
class CustomListView(ListView):
def get_queryset(self):
return Message.objects.filter(lab__acronym=self.kwargs['lab'])
and use CustomListView
in urls also.
Umar Asghar
class CustomListView(ListView):
model = Message
def get(self, request, *args, **kwagrs):
# either
self.object_list = self.get_queryset()
self.object_list = self.object_list.filter(lab__acronym=kwargs['lab'])
# or
queryset = Lab.objects.filter(acronym=kwargs['lab'])
if queryset.exists():
self.object_list = self.object_list.filter(lab__acronym=kwargs['lab'])
else:
raise Http404("No lab found for this acronym")
# in both cases
context = self.get_context_data()
return self.render_to_response(context)
来源:https://stackoverflow.com/questions/19360874/pass-url-argument-to-listview-queryset