이 이슈를 며칠 동안 조사했는데 정확히 무엇을 찾고 있는지 찾을 수 없습니다. 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을 적절한 구문으로 업데이트했습니다. 올바른 방향으로 나를 도와 주셔서 감사합니다. 마지막 질문은 한보기에서 다른보기로 값을 전달하는 가장 좋은 방법입니까? 이 작업을 수행하는 더 좋은 방법이 있습니까? 이 접근법에 대해 우려가 있습니까?
도서 모델, get_absolute_url1() 메소드 및 URL을 표시 할 수 있습니까? –
@Daniel Roseman 어젯밤에 더 많은 조사를했고 URL을 사용하여 LISTVIEW에 값을 전달할 수 있다고 말할 수 있습니까? 나는 여러 가지 옵션을 가지고 놀았지만 그 중 하나를 사용할 수는 없었다. 그게 일반적으로 내가해야 할 일인가? –
나는 당신이 여기서하려고하는 것을 정말로 이해할 수 없다. 다른 것들과 별개로, BookByStatusView'form_valid' 메소드는 드롭 다운에서 문자열을 얻은 다음'get_absolute_url1()'을 호출하여 작동 할 수 없습니다. 하지만 ListView에 표시하려는 내용을 정확하게 설명해야합니다. –