Клонировать и редактировать объект с помощью 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'))
Любая идея, как я могу инициализировать?