У меня два разных взгляда, которые работают вместе. Formview и ListView. Работают нормально.
Вот мой HTML:
<form method="GET" autocomplete=off action="{% url 'Book:book_by_name_list' %}">
<div>
{{ form.dropdown }}
</div>
<button type="submit" class="button1">Submit</h3></div></button>
</form>
Вот мой FormView:
class BookByNameView(LoginRequiredMixin,FormView):
form_class = BookByNameForm
template_name = 'book_by_name.html'
def get_form_kwargs(self):
kwargs = super(BookByNameView, self).get_form_kwargs()
kwargs['user'] = self.request.user
return kwargs
Вот моя форма:
class BookByNameForm(forms.Form):
dropdown = forms.ModelChoiceField(queryset=Book.objects.none(),required=False)
def __init__(self, *args, **kwargs):
user = kwargs.pop('user')
dropdown = kwargs.pop('dropdown', None)
super(BookByNameForm, self).__init__(*args, **kwargs)
self.fields['dropdown'].widget.attrs['class'] = 'choices6'
qs = Book.objects.all()
self.fields['dropdown'].queryset = qs
Вот URL-адрес, который я использую:
url(r'^book_by_name_list/(?P<pk>\d+)/$',views.BookByNameListView.as_view(),name='book_by_name_list'),
Когда пользователь щелкает раскрывающийся список form.dropdown, просматривает и нажимает кнопку «Отправить», URL-адрес book_by_name_list возвращается через следующий ListView:
class BookByNameListView(LoginRequiredMixin,ListView):
model = Book
context_object_name = 'book_list'
template_name = 'book_by_name_list.html'
paginate_by = 15
def get_form_kwargs(self):
kwargs = super(BookByNameListView, self).get_form_kwargs()
kwargs['user'] = self.request.user
return kwargs
def get_context_data(self, **kwargs):
context = super(BookByNameListView, self).get_context_data(**kwargs)
dropdown = self.request.GET.get("dropdown", None)
context['dropdown'] = dropdown
return context
def get_queryset(self):
dropdown = self.request.GET.get("dropdown", None)
user = self.request.user
if dropdown:
queryset = Book.objects.filter(Q(id__exact=dropdown)).distinct()
else:
queryset = Book.objects.none()
return queryset
Используя приведенный выше код, раскрывающийся список извлекается с помощью HTML GET, и возвращается идентификатор раскрывающегося списка. Я пытаюсь выяснить, есть ли способ захватить издателя книги вместо идентификатора. Как-то получить другое поле модели на основе книги, которую выбирает конечный пользователь. В настоящее время я использую URL-адрес, который получает PK книги и работает. Есть ли способ получить раскрывающийся идентификатор книги и вернуть поле издателя вместо идентификатора? Я не хочу использовать сеансы, я пытаюсь выяснить, как получить идентификатор, а затем использовать его для получения издателя. Используйте вместо него HTML Post? Я делаю нечто подобное в другом представлении, но это подробное представление, поэтому легче получить атрибуты в этом конкретном представлении. Я в тупике. Заранее благодарим за любые мысли.