【发布时间】:2018-12-12 14:38:12
【问题描述】:
谁能帮我回答为什么我的更新视图功能不运行?它返回填充的表单和表单集,没有错误消息(并且没有文件附件)。
这发生在使用 formset(使用 modelformset_factory 制作)更新函数后:
def recipe_update(request, id=None):
if request.method == 'GET':
instance = get_object_or_404(Recipe, id=id, user=request.user)
form = RecipeForm(request.POST or None, request.FILES or None, instance=instance)
formset = IngredientModelFormset(queryset=Ingredient.objects.filter(recipe=instance))
elif request.method == 'POST':
instance = get_object_or_404(Recipe, id=id, user=request.user)
form = RecipeForm(request.POST, request.FILES or None)
formset = IngredientModelFormset(request.POST, request.FILES or None)
if form.is_valid() and formset.is_valid():
recipe = form.save()
for forms in formset:
ingredient = forms.save(commit=False)
ingredient.recipe = recipe
ingredient.save()
return redirect(recipe.get_absolute_url())
context = {
"instance": instance,
"form": form,
'formset': formset,
}
return render(request, "recipes/recipe_form.html", context)
create 函数工作正常:
def recipe_create(request):
if request.method == 'GET':
form = RecipeForm(request.POST or None, request.FILES or None)
formset = IngredientModelFormset(queryset=Ingredient.objects.none())
elif request.method == 'POST':
form = RecipeForm(request.POST, request.FILES or None)
formset = IngredientModelFormset(request.POST, request.FILES or None)
if form.is_valid() and formset.is_valid():
recipe = form.save()
for forms in formset:
ingredient = forms.save(commit=False)
ingredient.recipe = recipe
ingredient.save()
return redirect(recipe.get_absolute_url())
context = {
"form": form,
'formset': formset,
}
return render(request, "recipes/recipe_form.html", context)
非常感谢!
更新
我根据建议更改了代码,现在出现以下错误:['ManagementForm data is missing or has been tampered with']
我在模板中使用 management_form:
{{ formset.management_form }}
{% for forms in formset %}
<div class="row form-row spacer">
<div class="col-2">
<label>{{ forms.name.label }}</label>
</div>
<div class="col-4">
<div class="input-group">
{{ forms.name }}
<div class="input-group-append">
<button class="btn btn-success add-form-row">+</button>
</div>
</div>
</div>
</div>
{% endfor %}
这是更新后的视图代码:
def recipe_update(request, id=None):
instance = get_object_or_404(Recipe, id=id, user=request.user)
form = RecipeForm(request.POST, request.FILES or None, instance=instance)
formset = IngredientModelFormset(request.POST, request.FILES or None, instance=instance)
if form.is_valid() and formset.is_valid():
recipe = form.save()
recipe.user = request.user
recipe.save()
for forms in formset:
ingredient = forms.save(commit=False)
ingredient.recipe = recipe
ingredient.save()
return redirect(recipe.get_absolute_url())
context = {
"instance": instance,
"form": form,
'formset': formset,
}
return render(request, "recipes/recipe_form.html", context)
【问题讨论】: