Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django使用URL过滤ModelChoiceField queryset以填充表单_Python_Django_Django Forms_Django Views - Fatal编程技术网

Python Django使用URL过滤ModelChoiceField queryset以填充表单

Python Django使用URL过滤ModelChoiceField queryset以填充表单,python,django,django-forms,django-views,Python,Django,Django Forms,Django Views,我相信这不是一个简单的解决办法,就是我从根本上误解了一些东西 在这个应用程序中,商店是“产品”,每个商店都有几种不同的债券 所需的行为本质上是: 用户被定向到website.com/stores/store slug 匹配存储的过滤器Store.objects.Filter(锚定=Store\u slug) 表单选项填充有Bonds.objects.filter(store=store) 我想用与该存储相关联的绑定填充ListingForm的选项。 有人能帮我做到这一点吗 url.py urlp

我相信这不是一个简单的解决办法,就是我从根本上误解了一些东西

在这个应用程序中,商店是“产品”,每个商店都有几种不同的债券

所需的行为本质上是:

  • 用户被定向到
    website.com/stores/store slug
  • 匹配存储的过滤器
    Store.objects.Filter(锚定=Store\u slug)
  • 表单选项填充有
    Bonds.objects.filter(store=store)
  • 我想用与该存储相关联的绑定填充ListingForm的选项。 有人能帮我做到这一点吗

    url.py

    urlpatterns = [
        path('', views.HomeView.as_view(), name='home'),
        path('stores/<slug:anchor>', views.ListingView.as_view(), name='listing'),
    ]
    
    view.py

    class ListingView(FormView):
        template_name = 'listing.html'
        form_class = ListingForm
        success_url = '/checkout/preview' # todo
    
        anchor = None # this feels wrong...
        store = None
        queryset = None
    
        def get_form_kwargs(self):
            kwargs = super(ListingView, self).get_form_kwargs()
            kwargs['store'] = self.store
    
        def get_context_data(self, **kwargs):
            self.anchor = self.kwargs.get('anchor')
            self.store = Store.objects.filter(anchor_id=self.anchor).first()
            self.queryset = Bond.objects.filter(store=self.store)
    
            context = super(FormView, self).get_context_data(**kwargs)
    
            context['store'] = self.store
            context['store_bonds'] = self.queryset
            return context
    
        def form_valid(self, form):
            # save selected bond to session
            # redirect to success_url
            face_value = form.cleaned_data['face_value']
            bond = Bond.objects.filter(store=self.store, face_value=face_value).first()
    
            if bond:
                self.request.session['bond'] = bond
                return super().form_valid(form)
    

    您可以在视图中手动覆盖它,在该视图中,您将拥有store_slug:

    class ListingView(FormView):
    
        def get_form(self, form_class=None):
            store_slug = self.kwargs['store_slug']
            form = ListingForm()
            form.fields['face_value'].queryset = Store.objects.filter(anchor=store_slug)
            return form
    
    而表单中只有一个占位符

    class ListingForm(forms.Form):
        face_value = forms.ModelChoiceField(queryset=Store.objects.all())
    
    class ListingForm(forms.Form):
        face_value = forms.ModelChoiceField(queryset=Store.objects.all())