首页 > 解决方案 > 使用 FormView 在 Django 中通过 URL 传递模型字段值

问题描述

我有两种不同的观点共同作用。一个 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>

这是我的表单视图:

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、view 并点击 submit 时,book_by_name_list URL 通过以下 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 检索下拉列表并返回下拉列表的 ID。我试图弄清楚是否有办法捕获这本书的出版商而不是 ID。根据最终用户选择的书籍,以某种方式获得模型的不同字段。目前我使用的 URL 正在获取本书的 PK 并且正在运行。有没有办法捕获图书的下拉 ID 并返回出版商字段而不是 ID?我不想使用会话,我想弄清楚如何获取 ID,然后使用它来获取发布者。改用 HTML Post 吗?我在不同的视图中做类似的事情,但它在细节视图中,因此更容易在该特定视图中获取属性。我难住了。提前感谢您的任何想法。

标签: djangodjango-modelsdjango-formsdjango-viewsdjango-templates

解决方案


推荐阅读