Как отфильтровать поле модели в форме, которая является внешним ключом, но не основным внешним ключом

У меня есть inlineformset_factory, представляющая собой группу ShoppingListItemForm.

Вид:

class ShoppingListItemForm(ModelForm):
    @property
    def __name__(self):
        return self.__class__.__name__

    def __init__(self, *args, **kwargs):

        if kwargs.get('instance'):

            theList = kwargs['instance']
            self.fields['category'] = forms.ChoiceField(choices=[(cat.id, cat.name) for cat in ListItemCategory.objects.filter(shoppinglist__id=theList.id)])

        return super(ShoppingListItemForm, self).__init__(self, *args, **kwargs)



    class Meta:
        model = ShoppingListItem
        fields = ('item', 'brand', 'quantity', 'current', 'category', 'size', )


@login_required
def shoppinglist(request, shoppinglist_id, pod_id):
    profile = request.user.get_profile()
    shoppinglist = get_object_or_404(ShoppingList, pk=shoppinglist_id)

    ListFormSet = inlineformset_factory(ShoppingList, ShoppingListItem, form=ShoppingListItemForm, extra=1, can_delete=True)

    myForms = ListFormSet(instance=shoppinglist)

... Это прекрасно работает, за исключением того, что «категория» является внешним ключом ShoppingListItem, и мне нужно отфильтровать параметры «категории», предлагаемые в моей форме, только для тех, которые связаны с ListItemCategory через «список покупок». «список покупок» является внешним ключом как для ListItemCategory, так и для ShoppingListItem.

Модели:

class ListItemCategory(models.Model):
    name = models.CharField(max_length=30, blank=True, null=True)
    shoppinglist = models.ForeignKey(ShoppingList)

class ShoppingListItem(models.Model):
    shoppinglist = models.ForeignKey(ShoppingList)
    category = models.ForeignKey(ListItemCategory, blank=True, null=True, default = None)
    item = models.CharField(max_length=200, blank=True, null=True)

class ShoppingList(models.Model):
    name = models.CharField(max_length=30, blank=True, null=True, default="Pod List")

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

Любые дальнейшие советы?


person timdude    schedule 15.05.2015    source источник


Ответы (1)


Ваша проблема в том, что вы не «инициализируете» переменную shoppinglist_id в своей форме def init

Попробуй это:

class ShoppingListItemForm(ModelForm):
    class Meta:
        model = ShoppingListItem
        fields = ('item', 'brand', 'quantity', 'current', 'category', 'size', )

    def __init__(self, *args, **kwargs):
        shoppinglist_id = kwargs.pop('shoppinglist_id', None)
        super(ShoppingListItemForm, self).__init__(*args, **kwargs)
        self.fields['category'].queryset = ListItemCategory.objects.filter(shoppinglist__id=shoppinglist_id)

И вы также должны отредактировать, как инициализировать форму:

ListFormSet = inlineformset_factory(ShoppingList, ShoppingListItem, form=ShoppingListItemForm(shoppinglist_id=shoppinglist.id), extra=1, can_delete=True)

Внесены следующие изменения:

  1. Передайте shoppinglist_id в качестве аргумента kwarg

...ShoppingListItemForm(shoppinglist_id=shoppinglist.id)

  1. Получите аргумент kwarg в своей форме

    def __init__(self, *args, **kwargs): shoppinglist_id = kwargs.pop('shoppinglist_id', None)

person AlvaroAV    schedule 15.05.2015