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)
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())