Передать значение поля модели через URL-адрес в Django с помощью FormView - PullRequest
0 голосов
/ 06 мая 2020

У меня два разных взгляда, которые работают вместе. 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? Я делаю нечто подобное в другом представлении, но это подробное представление, поэтому легче получить атрибуты в этом конкретном представлении. Я в тупике. Заранее благодарим за любые мысли.

...