2015-07-23 3 views
1

Очень простой пользовательский подход к классу Django. У меня был ListView, который работал хорошо, но отображал все объекты. Я хотел, чтобы фильтровать это, и вот что я сделал, следующие несколько примеров найдено:Django: как вводить данные при переопределении get_queryset()?

models.py:

class FolderElement(TimeStampedModel): 
    user = models.ForeignKey(settings.AUTH_USER_MODEL) 

class FolderMedia(TimeStampedModel): 
    folder_element = models.ForeignKey(FolderElement) 
    file = models.FileField(upload_to=generate_filepath_folder) 
    slug = models.SlugField(max_length=50, blank=True) 

views.py:

class FolderMediaListView(ListView): 
    model = FolderMedia 
    template_name = "book.html" 

    def get_queryset(self): 
     self.folder_element = get_object_or_404(FolderElement, 
               pk=self.kwargs['pk']) 
     return FolderMedia.filter(folder_element=self.folder_element) 

    def render_to_response(self, context, **response_kwargs): 
     files = [ serialize(p) for p in self.get_queryset() ] 
     data = {'files': files} 
     response = JSONResponse(data, mimetype=response_mimetype(self.request)) 
     response['Content-Disposition'] = 'inline; filename=files.json' 
     return response 

Но теперь, Я переопределил метод get_queryset(), я не понимаю, как я должен ввести параметр pk в представление, если фильтр работает. В настоящее время, используя pdb, я вижу, что self.kwargs равен {} в методе get_queryset().

Спасибо.

ответ

1

именованные аргументы (kwargs), что диспетчер Джанго URL-адрес переходит на вид исходит из следующих:

  • достающихся параметров в выражении URL
  • Дополнительные аргументы, указанные в Определение URL

Все они в urls.py.

Так, например, для того, чтобы получить идентификатор сформировать URL в форме: /folder/id/:

url(r'folder/(?P<pk>\d+)/', FolderMediaListView.as_view) 

Или, если идентификатор является постоянным (более редко), вы можете передать его в качестве дополнительного аргумента :

url(r'folder/', FolderMediaListView.as_view, {'pk': 1}) 

Дополнительная информация по теме Django documentation.

+0

Спасибо за это подробное объяснение! –

+0

Добро пожаловать! – Wtower

1

Необходимо указать его в URL-адресе. Например:

url(r'folder/(?P<id>\d+)/media', FolderMediaListView.as_view, name='folder_media_list') 
+0

Спасибо Daniel :) –

Смежные вопросы