forms – 根据以前表单上的选择,在formtools向导中限制Django表单的ManyToManyField查询集

forms – 根据以前表单上的选择,在formtools向导中限制Django表单的ManyToManyField查询集,第1张

概述我正在使用 django-formtools的SessionWizardView构建一个双表单向导.我面临的挑战是我需要引用第一个表单中的输入来限制第二个表单上的可用查询集. 为了使它更有趣,我使用crispy表单进行布局,并且查询集需要受到相关项上的方法的限制. 这是我所处的(简化)的要点: 楷模 class Product(models.Model): # pk, name, etc. 我正在使用 django-formtools的SessionWizardVIEw构建一个双表单向导.我面临的挑战是我需要引用第一个表单中的输入来限制第二个表单上的可用查询集.

为了使它更有趣,我使用crispy表单进行布局,并且查询集需要受到相关项上的方法的限制.

这是我所处的(简化)的要点:

楷模

class Product(models.Model):    # pk,name,etc....    catalogitem = ForeignKey("myapp.CatalogItem")    colors = ManyToManyFIEld("myapp.colors")class colors(models.Model):    # pk,etc....class CatalogItem(models.Model):    # colors are stored within CatalogVariants,which I've left    # as a blackBox in this example,since they are retrIEved as    # a queryset on this model with this method:    # pk,etc....    def get_colors(self):        # Returns a queryset of color objects.

查看

ProductFormWizard(SessionWizardVIEw):    form_List = [        productFormWizard_Step1,productFormWizard_Step2,]    def get_context_data(self,**kwargs):       # ...       pass    def get_form_initial(self,step):        initial = {}        # ...        return self.initial_dict.get(step,initial)    def process_step(self,form):        if self.steps.step1 == 1:            pass        return self.get_form_step_data(form)    def done(self,form_List,**kwargs):        return render(self.request,'done.HTML',{            'form_data': [form.cleaned_data for form in form_List],})

形式

productFormWizard_Step1(forms.ModelForm):    # defines a form where the user selects a CatalogProduct.    model = ProductproductFormWizard_Step2(forms.ModelForm):    """    defines a form where the user chooses colors based on     the CatalogProduct they selected in the prevIoUs step.    """    model = Product

根据谷歌的研究和一些SO问题(没有一个是=直接=相关),我假设我需要在colors字段设置.queryset属性,但我不确定在哪里做.两个想法:

>我猜它会以某种方式进入.get_form_initial(),但我对实现这一目标的最佳方法感到茫然.
>或者,相应的代码可能以某种方式进入productFormWizard.get_context_data()方法.

在.get_form_initial()中,我可以这样做:

if step == '1':    itemID = self.storage.get_step_data('0').data.get('0-pfProduct',"")    if itemID:        obj = CatalogItem.objects.get(ID=itemID)        initial['colors'] = obj.get_get_colors()

但是,这只是选择可用的相关项目……它不限制列表.

附加信息

Python == 3.5.3Django == 1.10.6django-crispy-forms == 1.6.1django-formtools == 2.0
解决方法 解决方案是覆盖VIEw上的.get_form()方法:
def get_form(self,step=None,data=None,files=None):  form = super(bzProductFormWizard,self).get_form(step,data,files)    if step == '1':        past_data = self.get_cleaned_data_for_step('0')        product = past_data['product']        form.fIElds['colors'].queryset = ... #CUSTOM querySET    return form
总结

以上是内存溢出为你收集整理的forms – 根据以前表单上的选择,在formtools向导中限制Django表单的ManyToManyField查询集全部内容,希望文章能够帮你解决forms – 根据以前表单上的选择,在formtools向导中限制Django表单的ManyToManyField查询集所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1134559.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-30
下一篇2022-05-30

发表评论

登录后才能评论

评论列表(0条)

    保存