Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 具有多个表单集的UpdateView不工作_Python_Django_Django Class Based Views_Inline Formset - Fatal编程技术网

Python 具有多个表单集的UpdateView不工作

Python 具有多个表单集的UpdateView不工作,python,django,django-class-based-views,inline-formset,Python,Django,Django Class Based Views,Inline Formset,我尝试基于中提供的CreateView为一个与其他两个模型具有泛型关系的模型创建泛型UpdateView。 表单和表单集按预期填充,但保存时会重定向到“模型详细信息”页面,更改不会保存 我的问题类似于,但提供的建议没有帮助,因为它们是针对前一个问题的 这是我的密码: # models.py class Ingredient(models.Model): ... content_type = models.ForeignKey(ContentType, editable=False

我尝试基于中提供的CreateView为一个与其他两个模型具有泛型关系的模型创建泛型UpdateView。 表单和表单集按预期填充,但保存时会重定向到“模型详细信息”页面,更改不会保存

我的问题类似于,但提供的建议没有帮助,因为它们是针对前一个问题的

这是我的密码:

# models.py
class Ingredient(models.Model):
    ...
    content_type = models.ForeignKey(ContentType, editable=False)
    object_id = models.PositiveIntegerField(editable=False)
    content_object = GenericForeignKey()

class Step(models.Model):
    Same as Ingredient

class Recipe(models.Model):
    ...
    ingredients = generic.GenericRelation(Ingredient)
    steps = generic.GenericRelation(Step)

# forms.py
class RecipeForm(forms.ModelForm):
    class Meta:
        model = Recipe

IngredientFormSet = generic_inlineformset_factory(Ingredient, extra=1)
StepFormSet = generic_inlineformset_factory(Step, extra=1)

# views.py
class RecipeUpdate(UpdateView):
    model = Recipe
    form_class = RecipeForm
    template_name = 'app_recipes/recipe_add.html'

    def get(self, request, *args, **kwargs):
        self.object = self.get_object()
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        ingredient_form = IngredientFormSet(instance = self.object)
        step_form = StepFormSet(instance = self.object)
        return self.render_to_response(self.get_context_data(
                    form=form,
                    ingredient_form=ingredient_form,
                    step_form=step_form))

    def post(self, request, *args, **kwargs):
        self.object = self.get_object()
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        ingredient_form = IngredientFormSet(self.request.POST, instance=self.object)
        step_form = StepFormSet(self.request.POST, instance=self.object)
        if (form.is_valid() and ingredient_form.is_valid() and step_form.is_valid()):
            return self.form_valid(form, ingredient_form, step_form)
        else:
            return self.form_invalid(form, ingredient_form, step_form)

    def form_valid(self, form, ingredient_form, step_form):
        self.object = form.save()
        ingredient_form.instance = self.object
        ingredient_form.save()
        step_form.instance = self.object
        step_form.save()
        return HttpResponseRedirect(self.get_success_url())

    def form_invalid(self, form, ingredient_form, step_form):
        return self.render_to_response(self.get_context_data(
                form=form,
                ingredient_form=ingredient_form,
                step_form=step_form))

    def get_success_url(self):
        return reverse('recipe_detail', kwargs={'pk': self.object.pk})
我使用的模板与CreateView使用的模板相同:

...
<script src="{{ STATIC_URL }}js/jquery.formset.js"></script>  # django-dynamic-formset
<script type="text/javascript">
    $(function() {
        $(".inline.{{ ingredient_form.prefix }}").formset({
            prefix: "{{ ingredient_form.prefix }}",
        })
        $(".inline.{{ step_form.prefix }}").formset({
            prefix: "{{ step_form.prefix }}",
        })
    })
</script>
...
<form action="." method="post">
    {% csrf_token %}
    <div>
        {{ form.as_p }}
    </div>
    <fieldset>
        <legend>Recipe Ingredients</legend>
        {{ ingredient_form.management_form }}
        {{ ingredient_form.non_form_errors }}
        {% for form in ingredient_form %}
            {{ form.id }}
            <div class="inline {{ ingredient_form.prefix }}">
            {% for field in form.visible_fields %}
                <div>
                {{ field.errors }}
                {{ field.label_tag }}
                {{ field }}
                </div>
            {% endfor %}
            </div>
        {% endfor %}
    </fieldset>
    <fieldset>
        <legend>Recipe Steps</legend>
        {{ step_form.management_form }}
        {{ step_form.non_form_errors }}
        {% for form in step_form %}
            {{ form.id }}
            <div class="inline {{ step_form.prefix }}">
            {% for field in form.visible_fields %}
                <div>
                {{ field.errors }}
                {{ field.label_tag }}
                {{ field }}
                </div>
            {% endfor %}
            </div>
        {% endfor %}
    </fieldset>
    <input type="submit" value="Add recipe" class="submit" />
</form> 
...
。。。
#django动态表单集
$(函数(){
$(“.inline.{{component_form.prefix}}”).formset({
前缀:“{{component_form.prefix}}”,
})
$(“.inline.{{step_form.prefix}}”).formset({
前缀:“{step_form.prefix}}”,
})
})
...
{%csrf_令牌%}
{{form.as_p}}
配方成分
{{component_form.management_form}}
{{component_form.non_form_errors}
{成分形式%中形式的%}
{{form.id}
{%form.visible_fields%}
{{field.errors}}
{{field.label_tag}
{{field}}
{%endfor%}
{%endfor%}
配方步骤
{{step_form.management_form}}
{{step_form.non_form_errors}}
{步骤_form%}中的表单为%
{{form.id}
{%form.visible_fields%}
{{field.errors}}
{{field.label_tag}
{{field}}
{%endfor%}
{%endfor%}
...
注意:我在模板中使用动态添加和删除表单集中的表单。
多谢各位