Ограничение набора запросов ManyToManyField формы Django в Мастере formtools на основе выбора предыдущей формы

я использую SessionWizardView С Джанго-formtools для создания мастера двух форм. Проблема, с которой я сталкиваюсь, заключается в том, что мне нужно ссылаться на ввод из первой формы, чтобы ограничить доступные запросы во второй форме.

чтобы сделать его более интересным, я использую хрустящие формы для макета, и queryset должен быть ограничен методом для связанного элемента.

вот (очень упрощенная) суть того, где я нахожусь at:

модели

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

основываясь на исследованиях через Googles и некоторых вопросах SO (ни один из которых не был =напрямую= связан), я предполагаю, что мне нужно установить .queryset собственности на colors поле, но я не совсем уверен, где это сделать. Две мысли:--13-->

  • я бы предположил, что он едет в .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

1 ответов


раствор для переопределения .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