Дублирование наборов форм в Django
Я использовал наборы встроенных форм для создания формы, но по какой-то причине поля дублируются, и я не могу понять, где я допустил ошибку.
Не обращайте внимания на плохую укладку!
Вот мой 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 }}
ошибка дублирования была исправлена.