具有多个内联表单的基于Django类的CreateView和UpdateView

前端之家收集整理的这篇文章主要介绍了具有多个内联表单的基于Django类的CreateView和UpdateView前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我一直在尝试使用多个内联表单来执行基于Django类的CreateView和UpdateView

CreateView工作正常,但UpdateView无法正常工作,如果任何人尝试使用多个内联表单的UpdateView,任何人都尝试过共享更新视图代码段.

# models.py
from django.db import models

class Recipe(models.Model):
    title = models.CharField(max_length=255)
    description = models.TextField()

class Ingredient(models.Model):
    recipe = models.ForeignKey(Recipe)
    description = models.CharField(max_length=255)

class Instruction(models.Model):
    recipe = models.ForeignKey(Recipe)
    number = models.PositiveSmallIntegerField()
    description = models.TextField()


# forms.py
from django.forms import ModelForm
from django.forms.models import inlineformset_factory
from .models import Recipe,Ingredient,Instruction

class RecipeForm(ModelForm):
    class Meta:
        model = Recipe

IngredientFormSet = inlineformset_factory(Recipe,extra=0)
InstructionFormSet = inlineformset_factory(Recipe,Instruction,extra=0)


# views.py
from django.http import HttpResponseRedirect
from django.views.generic.edit import CreateView,UpdateView
from django.shortcuts import get_object_or_404

from .forms import IngredientFormSet,InstructionFormSet,RecipeForm
from .models import Recipe

class RecipeCreateView(CreateView):
    template_name = 'recipe_add.html'
    model = Recipe
    form_class = RecipeForm
    success_url = '/account/dashboard/'

    def get(self,request,*args,**kwargs):
        self.object = None
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        ingredient_form = IngredientFormSet()
        instruction_form = InstructionFormSet()
        return self.render_to_response(
            self.get_context_data(form=form,ingredient_form=ingredient_form,instruction_form=instruction_form))

    def post(self,**kwargs):
        self.object = None
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        ingredient_form = IngredientFormSet(self.request.POST)
        instruction_form = InstructionFormSet(self.request.POST)
        if (form.is_valid() and ingredient_form.is_valid() and
            instruction_form.is_valid()):
            return self.form_valid(form,ingredient_form,instruction_form)
        else:
            return self.form_invalid(form,instruction_form)

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

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

class RecipeUpdateView(UpdateView):
    template_name = 'recipe_add.html'
    model = Recipe
    form_class = RecipeForm

    def get_success_url(self):
        self.success_url = '/account/dashboard/'
        return self.success_url

    def get_context_data(self,**kwargs):
        context = super(RecipeUpdateView,self).get_context_data(**kwargs)
        if self.request.POST:
            context['form'] = RecipeForm(self.request.POST,instance=self.object)
            context['ingredient_form'] = IngredientFormSet(self.request.POST,instance=self.object)
            context['instruction_form'] = InstructionFormSet(self.request.POST,instance=self.object)
        else:
            context['form'] = RecipeForm(instance=self.object)
            context['ingredient_form'] = IngredientFormSet(instance=self.object)
            context['instruction_form'] = InstructionFormSet(instance=self.object)
        return context

    def post(self,instruction_form=instruction_form))

提前致谢.

解决方法

我的猜测是你不能做
self.object = None

在UpdateView中覆盖的post方法.所以,尝试

self.object = self.get_object()

相反,一旦你在这种情况下已经有一个对象实例.

原文链接:https://www.f2er.com/html/230560.html

猜你在找的HTML相关文章