gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:24:27 24 4
gpt4 key购买 nike

我正在使用django-formtools中的SessionWizardView构造一个两种形式的向导。我面临的挑战是,我需要引用第一种形式的输入以限制第二种形式的可用查询集。

为了使它更有趣,我使用了易碎的表单进行布局,并且需要通过相关项目上的方法来限制queryset。

这是我所处位置的(经过简化的)要点:

楷模

class Product(models.Model):
# pk, name, etc....
catalogitem = ForeignKey("myapp.CatalogItem")
colors = ManyToManyField("myapp.Colors")

class Colors(models.Model):
# pk, name, 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, name, 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 = Product

productFormWizard_Step2(forms.ModelForm):
"""
Defines a form where the user chooses colors based on
the CatalogProduct they selected in the previous step.
"""
model = Product

基于对Google的研究和一些SO问题(都与= direct =不相关),我假设我需要在 .queryset字段上设置 colors属性,但我不确定要在哪里进行设置。两个想法:
  • 我想它会以某种方式出现在.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.3
    Django == 1.10.6
    django-crispy-forms == 1.6.1
    django-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查询集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42751798/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com