0

이 이슈를 며칠 동안 조사했는데 정확히 무엇을 찾고 있는지 찾을 수 없습니다. StackOverflow의 ChoiceField뿐만 아니라 Google뿐만 아니라 ModelChoiceField를 검색했으며 내 질문에는 많은 변형이 있지만 정확히 아무것도 없습니다. 간단히 말해, 클래스 기반 FormView를 사용하고 사용자 선택을 캡처하여 클래스 기반 ListView에 전달하려고합니다. 여기 내 코드가있다.클래스 기반 FormView

Forms.Py

class BookByStatus(forms.Form): 

    dropdown = forms.ChoiceField(choices=[],required=False) 

    def __init__(self, user, *args, **kwargs): 
     super(BookByStatus, self).__init__(*args, **kwargs) 
     self.fields['dropdown'].widget.attrs['class'] = 'choices1' 
     self.fields['dropdown'].empty_label = '' 
     self.fields['dropdown'].choices = 
     Book.objects.values_list("author","author").distinct("Publisher") 

위의 코드는 잘 작동하고 나에게 내가보기에 찾고 있어요 출력을 보여줍니다. 거기에 어떤 문제가 .... 그럼 난 내 FormView ...

class BookByStatusView(LoginRequiredMixin,FormView): 
    model = Book 
    form_class = BookByStatus 
    template_name = 'xyz123/publisher.html' 
    success_url = reverse_lazy('Book:book_by_list',kwargs= 
           {'dropdown':'dropdown'}) 

    def get_form_kwargs(self): 
     kwargs = super(BookByStatusView, self).get_form_kwargs() 
     kwargs['user'] = self.request.user   
     return kwargs 

    def form_valid(self, form): 
     self.request.POST['dropdown'] 
     BookByStatusView = form.cleaned_data['dropdown'] 
     return super(BookByStatusView, self).form_valid(form) 

위의 코드는 잘 작동하지만 내가 드롭 다운 값을 전달하는 것 같지 수있는 아래의 ListView에 저를 필요가 없습니다 ... . get_form_kwargs 여러 가지 반복 시도뿐만 아니라 내 양식을 ModelChoiceField 변경했지만 여전히 사용자로부터 입력을 기반으로 쿼리 집합을 얻는 방법을 이해할 수없는 것 ...

마지막으로 ListView ...

class BookByStatusListView(LoginRequiredMixin,ListView): 
    model = Book 
    form_class = BookByStatus 
    context_object_name = 'book_list' 
    template_name = 'xyz123/book_by_status_list.html' 
    paginate_by = 15 

    def get_queryset(self, *kwargs): 
     form = self.form_class(self.request.GET) 
     dropdown = self.kwargs.get('dropdown', None) 
     if form.is_valid(): 
      return Book.objects.filter(dropdown__icontains=form. 
      cleaned_data['dropdown']) 
     return Book.objects.all() 

FormView에서 드롭 다운 입력을 시도하고 있습니다. 두 개의 개별보기를 사용하여 목록보기로 전달하십시오. FormView에서 ListView 값을 전달해야합니다. ChoiceField의 FormView에서 데이터를 가져 오는 방법과 ListView를 표시하는 방법은 분명하지만 FormView의 드롭 다운 데이터를 ListView로 전달하는 방법을 알 수 없습니다. ListView는 작동하도록 설정할 수 있지만 필터링 된 필터 세트가 아닌 전체 쿼리 세트에서만 사용할 수 있습니다. 어떤 제안에 미리

여기에 책의 모델입니다 ....

여기에 URL이의
class Book(models.Model): 
    Author CHOICES = (
     ("New","New"), 
     ("Old","Old"), 
    ) 

    Author = models.CharField(choices=Author_CHOICES,max_length=10) 

...

url(r'^book_by_list/(? 
P<dropdown>\w+)/$',views.BookByStatusListView.as_view(), 
name='book_by_list'), 

감사합니다!

접근 방식 ... request.session 사용. 내 이전 접근 방식은 아무리 많은 get_context_data 또는 get_form_kwargs 조합을 사용해도 한보기에서 다른보기로 값을 전달하지 못하게합니다. 받은 입력을 기반으로 request.session 접근 방식을 탐색하기 시작했으며 훨씬 더 많이 얻었습니다. 하나의 마지막 부분은 내 LISTVIEW에 request.session 값을 가져 와서 그에 따라 쿼리 세트를 필터링 할 수 있습니다.

class BookByStatusView(LoginRequiredMixin,FormView): 

    model = Book 
    form_class = BookByStatus 
    template_name = 'xyz123/publisher.html' 
    success_url = reverse_lazy('Book:book_by_list') 

    def form_valid(self, form): 
     self.request.session['dropdown'] = form.cleaned_data['dropdown'] 
     return super(BookByStatusView, self).form_valid(form) 

    def get_form_kwargs(self): 
     kwargs = super(BookByStatusView, self).get_form_kwargs() 
     kwargs['user'] = self.request.user 
     return kwargs 

그리고 내 HTML 템플릿에, 나는 같은 request.session 값을 활용

...

{{ request.session.dropdown }} 

그리고 내가 다시 URL을 복귀 ..

url(r'^book_by_list/$,views.BookByStatusListView.as_view(), 
name='book_by_list'), 

남아있는 마지막 이 방법으로 LISTVIEW를 활용하는 방법을 파악해야합니다.

나의 현재 목록보기 : 나는의 검색어가 제대로 표시되도록 ListView에 올바르게 드롭 다운 값을 전달하는 방법을 알아낼 수 없습니다

class BookByStatusListView(LoginRequiredMixin,ListView): 
    model = Book 
    form_class = BookByStatus 
    context_object_name = 'book_list' 
    template_name = 'xyz123/book_by_status_list.html' 
    paginate_by = 15 

def get_queryset(self): 
    queryset = Book.objects.none() 
    dropdown = self.request.session.get('dropdown') 
    if dropdown == 'New': 
     queryset = Book.objects.all() 
    elif dropdown == 'Old': 
     queryset = Book.objects.none() 
    return queryset 

. 내 테스트를 기반으로, 나는 제대로 get_queryset 함수에서 드롭 다운을 캡처하는 것으로 보이지 않습니다. 어떤 아이디어?

나는 그것을 알아 냈다. get_queryset을 적절한 구문으로 업데이트했습니다. 올바른 방향으로 나를 도와 주셔서 감사합니다. 마지막 질문은 한보기에서 다른보기로 값을 전달하는 가장 좋은 방법입니까? 이 작업을 수행하는 더 좋은 방법이 있습니까? 이 접근법에 대해 우려가 있습니까?

+0

도서 모델, get_absolute_url1() 메소드 및 URL을 표시 할 수 있습니까? –

+0

@Daniel Roseman 어젯밤에 더 많은 조사를했고 URL을 사용하여 LISTVIEW에 값을 전달할 수 있다고 말할 수 있습니까? 나는 여러 가지 옵션을 가지고 놀았지만 그 중 하나를 사용할 수는 없었다. 그게 일반적으로 내가해야 할 일인가? –

+0

나는 당신이 여기서하려고하는 것을 정말로 이해할 수 없다. 다른 것들과 별개로, BookByStatusView'form_valid' 메소드는 드롭 다운에서 문자열을 얻은 다음'get_absolute_url1()'을 호출하여 작동 할 수 없습니다. 하지만 ListView에 표시하려는 내용을 정확하게 설명해야합니다. –

답변

0

리디렉션이 새 요청/응답을 만들고 이전의 데이터가 손실되기 때문에 이것은 작동하지 않습니다. 내가 원하는 것을 정확히 이해한다면 옵션 중 하나는 드롭 다운 값을 BookByStatusView에 세션에 저장 한 다음 BookByStatusListView에서 검색하는 것입니다.

당신은 함께 세션에 저장합니다

request.session['dropdown_value'] = form.cleaned_data['dropdown'] 

와 함께 검색 :

dropdown_value = request.GET.get('dropdown_value') 

여기 장고 문서의 How to use session 일부입니다.

편집 : 당신은 또한이 같은 URL 매개 변수로 값을 전달할 수 있습니다

author = 'michael cricthon' 
title = 'kongo' 
year = [1999, 2000, 2001] 
type = ['electronic', 'print', 'hardcover', 'softcover'] 

params = '?author={}&title={}&&year={}&type={}'.format(
      urllib.parse.quote_plus(author), 
      urllib.parse.quote_plus(title), 
      ','.join(year), 
      ','.join(type)) 

return HttpResponseRedirect(reverse('search') + params) 

링크는 다음과 같이 보일 것이다 :

../search/?author=michael+crichton&title=kongo&year=1999,2000,2001&type=electronic,print,hardcover,softcover 

당신이 매개 변수를 가져

author = request.GET.get('author') 
title = request.GET.get('title') 
... etc. 
+0

입력 해 주셔서 감사합니다. 나는 그것을 연구 할 것이다. 클래스 기반 뷰를 사용하고 있는데 위의 입력 내용을 기반으로합니까? 나는 또한 URL을 통해 값을 전달하는 것을 탐구하기 시작했다. 그게 효과가 있니? –

+0

CBV를 사용하는 경우 중요하지 않습니다. 숫자, 문자열 또는 목록과 같은 간단한 값인 경우 URL을 통해 값을 전달할 수 있습니다. 값을 URL 매개 변수로 전달하는 옵션으로 답변을 업데이트하겠습니다. – Borut

+0

Request.session이 제 코드를 훨씬 중요하게 생각합니다. 마지막 부분은 내 listview에서 값을 얻으려고하는 것입니다. 지금까지 시도한 것으로 내 솔루션을 업데이트했습니다. 모든 것은 queryset 필터링을 제외하고는 작동합니다.내가 잘못하고있는 것에 대한 아이디어가 있습니까? –