2013-10-14 4 views
3

models.pyPass URL аргумент ListView QuerySet

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='') 
    )), 
) 

Я хочу передать аргумент lab ключевое слово в ListView QuerySet. Это означает, что если lab равно TEST, итоговый запрос будет Message.objects.filter(lab__acronym='TEST').

Как я могу это сделать?

+0

Использование «голых» классов по умолчанию - это хорошая идея, когда вам нужно что-то глупое простое - вернуть статический статический html или сделать перенаправление на фиксированный url. Лучший способ сделать то, что вам нужно, указан в ответе @AamirAdnan (также есть много примеров в учебнике django и docs). – Melevir

ответ

5

Вы должны написать свой собственный взгляд на это, а затем просто переопределить метод get_queryset:

class CustomListView(ListView): 
    def get_queryset(self): 
     return Message.objects.filter(lab__acronym=self.kwargs['lab']) 

и использовать CustomListView в адресах также.

+0

Он работает, спасибо. –

0
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") 
     context = self.get_context_data() 
     return self.render_to_response(context) 
Смежные вопросы