Дублирование наборов форм в Django

Я использовал наборы встроенных форм для создания формы, но по какой-то причине поля дублируются, и я не могу понять, где я допустил ошибку. enter image description here

Не обращайте внимания на плохую укладку!

Вот мой CreateView из Views.py

class RecipeInline():
    form_class = RecipeForm
    model = Recipe
    template_name = "recipes/recipe_form.html"

    def form_valid(self, form):
        named_formsets = self.get_named_formsets()
        if not all((x.is_valid() for x in named_formsets.values())):
            return self.render_to_response(self.get_context_data(form=form))
        
        self.object = form.save()

        for name, formset in named_formsets.items():
            formset_save_func = getattr(self, 'formset_{0}_valid'.format(name), None)
            if formset_save_func is not None:
                formset_save_func(formset)
            else:
                formset.save()
        return redirect('recipes-home')
    
    def formset_variantingredients_valid(self, formset):
        variantingredients = formset.save(commit=False)
        for variantingredient in variantingredients:
            variantingredient.recipe = self.object
            variantingredient.save()

    def formset_images_valid(self, formset):
        images = formset.save(commit=False)
        for image in images:
            image.recipe = self.object
            image.save()

class RecipeCreate(LoginRequiredMixin, RecipeInline, CreateView):

    def get_context_data(self, **kwargs):
        ctx = super(RecipeCreate, self).get_context_data(**kwargs)
        ctx['named_formsets'] = self.get_named_formsets()
        return ctx
    
    def get_named_formsets(self):
        if self.request.method == "GET":
            return {
                'variantingredients': VariantIngredientFormSet(prefix='variantingredients'),
                'images': ImageFormSet(prefix='images'),
            }
        else:
            return {
                'variantingredients': VariantIngredientFormSet(self.request.POST or None, self.request.FILES or None, prefix='variantingredients'),
                'images': ImageFormSet(self.request.POST or None, self.request.FILES or None, prefix='images'),
            }
        
class RecipeUpdate(RecipeInline, UpdateView):

    def get_context_data(self, **kwargs):
        ctx= super(RecipeUpdate, self).get_context_data(**kwargs)
        ctx['named_formsets'] = self.get_named_formsets()
        return ctx
    
    def get_named_formsets(self):
        return {
            'variants': VariantIngredientFormSet(self.request.POST or None, self.request.FILES or None, instance=self.object, prefix='variantingredients'),
            'images': ImageFormSet(self.request.POST or None, self.request.FILES or None, instance=self.object, prefix='images'),
        }

Кроме того, я автоматически назначил автора пользователю, но теперь он просит меня вручную ввести автора-

Вот моя модель:

class Recipe(models.Model):
    title = models.CharField(max_length=100)
    description = models.TextField()
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    serving = models.PositiveIntegerField(default=1)
    temperature = models.PositiveIntegerField(default=1)
    prep_time = models.PositiveIntegerField(default=1)
    cook_time = models.PositiveIntegerField(default=1)
    ##tags = models.ManyToManyField('Tag')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def get_absolute_url(self):
        return reverse('recipes-detail', kwargs={"pk": self.pk})

    def __str__(self):
        return self.title
    

Вот моя форма:

class RecipeForm(forms.ModelForm):

    class Meta:
        model = Recipe
        fields = '__all__'
        widgets = {
            'title' : forms.TextInput(
                attrs={
                    'class' : 'form-control'
                    }
                ),
            'temperature' : forms.TextInput(
                attrs={
                    'class': 'form-control'
                    }
                ),
            'description' : forms.TextInput(
                attrs={
                    'class': 'form-control'
                    }
                ),
            'author' : forms.TextInput(
                attrs={
                    'class': 'form-control'
                    }
                ),
            'serving' : forms.TextInput(
                attrs={
                    'class': 'form-control'
                    }
                ),
            'prep_time' : forms.TextInput(
                attrs={
                    'class': 'form-control'
                    }
                ),
            'cook_time' : forms.TextInput(
                attrs={
                    'class': 'form-control'
                    }
                ),
            'created_at' : forms.TextInput(
                attrs={
                    'class': 'form-control'
                    }
                ),
            'updated_at' : forms.TextInput(
                attrs={
                    'class': 'form-control'
                    }
                ),
        }

Вот мой шаблон:

{% endblock content %}

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

Большое спасибо за помощь!

Эта строка:

{{ form|crispy }}

- вот где происходило дублирование. После добавления тега crispy к:

{% with named_formsets.images as formset %}
        {{ formset.management_form|crispy }}

ошибка дублирования была исправлена.

Вернуться на верх