Клонировать и редактировать объект с помощью inlineformset factory

У меня есть три модели, а именно. Item, RecipeIngredient и Recipe, которые выглядят так:

Модель - RecipeIngredient

class RecipeIngredient(models.Model):
    item = models.ForeignKey(Item)
    recipe = models.ForeignKey(Recipe)
    item_quant = models.DecimalField(max_digits=7, decimal_places=2, default=0)
    sub_recipe = models.ForeignKey(
       Recipe, blank=True, null=True,
       related_name="sub_recipe"
    )

    class Meta:
       verbose_name = _("Recipe Ingredient")
       verbose_name_plural = _("Recipe Ingredients")
       unique_together = (('item', 'recipe'),)

Модель - Рецепт

class Recipe(models.Model):
    name = models.CharField(
        max_length=128,
    )
    num_servings = models.IntegerField()

    class Meta:
       verbose_name = 'Recipe'
       verbose_name_plural = 'Recipies'

Модель - Товар

    class Item(models.Model):
        name = models.CharField(
            max_length=128
        )

У меня есть RecipeCreateView, где я использую inlineformset_factory для создания рецепта и соответствующих ингредиентов.

У меня есть функциональность в RecipeListView для клонирования рецепта. Что я здесь делаю, так это то, что я перенаправляю на URL представления создания с идентификатором клонируемого рецепта.

RecipeCreateView -

    class RecipeCreateView(InventoryEditMixin, CreateView):
        model = Recipe
        form_class = RecipeForm
        template_name = 'inventory/recipe_add.html'
        formset_class = RecipeIngredientFormSet

        def get_initial(self):
        clone_recipe = self.request.GET.get('clone_recipe')
        if clone_recipe:
            recipe = Recipe.objects.filter(id=clone_recipe).first()
            if recipe:
                self.initial.update({'num_servings': recipe.num_servings})

        return self.initial

Под InventoryEditMixinЯ использую get_context_data для инициализации inlineformset_factory с использованием набора запросов.

    def get_context_data(self, **kwargs):
        clone_recipe = self.request.GET.get('clone_recipe')
        if clone_recipe:
            recipe = Recipe.objects.get(id=clone_recipe)
            ingredients = RecipeIngredient.objects.filter(
                recipe__id=clone_recipe)
            if recipe:
                context['formset'] = RecipeIngredientFormSet(
                    queryset=ingredients,
                )

        return context

Это не инициализация формы. Не в состоянии понять, почему.

Кстати, мой inlineformset_factory выглядит так:

    RecipeIngredientFormSet = inlineformset_factory(
        Recipe,
        RecipeIngredient,
        fk_name='recipe',
        form=RecipeIngredientForm,
        formset=BaseRecipeFormSet,
        can_order=False,
        can_delete=True, extra=1,
        fields=('id',
                'item',
                'item_quant'))

Любая идея, как я могу инициализировать?

0 ответов

Другие вопросы по тегам