Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.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
Django 动态填充表单集中的字段_Django_Django Forms_Inline Formset - Fatal编程技术网

Django 动态填充表单集中的字段

Django 动态填充表单集中的字段,django,django-forms,inline-formset,Django,Django Forms,Inline Formset,我有两个模型,看起来像这样: class RouteBase(models.Model): base = models.ForeignKey("Base") route = models.ForeignKey("Route") sequence = models.IntegerField() class Route(models.Model): bases = models.ManyToManyFiel

我有两个模型,看起来像这样:

class RouteBase(models.Model):
    base        =   models.ForeignKey("Base")
    route       =   models.ForeignKey("Route")
    sequence    =   models.IntegerField()

class Route(models.Model):
    bases       =   models.ManyToManyField("Base", through="RouteBase", blank=True)
    description =   models.TextField(blank=True)
    #and a few other attributes omitted for brevity
class RouteBaseForm(ModelForm):
    base = forms.ModelChoiceField(queryset=Base.objects.all(), widget=forms.TextInput)
    sequence = forms.IntegerField(widget=forms.HiddenInput)

    class Meta:
        model = RouteBase
…然后是一个如下所示的模型:

class RouteBase(models.Model):
    base        =   models.ForeignKey("Base")
    route       =   models.ForeignKey("Route")
    sequence    =   models.IntegerField()

class Route(models.Model):
    bases       =   models.ManyToManyField("Base", through="RouteBase", blank=True)
    description =   models.TextField(blank=True)
    #and a few other attributes omitted for brevity
class RouteBaseForm(ModelForm):
    base = forms.ModelChoiceField(queryset=Base.objects.all(), widget=forms.TextInput)
    sequence = forms.IntegerField(widget=forms.HiddenInput)

    class Meta:
        model = RouteBase
如您所见,sequence小部件是隐藏的,因为我希望这个字段由django自动处理。我希望用户只需通过文本框输入基数。序列由文本框的顺序推断

我已使用此表单创建了一个表单集,用于创建/编辑路线中的所有基础:

RouteBaseFormset = inlineformset_factory(Route, RouteBase, form=RouteBaseForm, extra=5, )
创建此表单集时,序列字段为空。我需要在保存表单集之前用值填充它(否则它将无法验证)。我可以想出四种方法来解决这个问题

  • 在将formset发送到模板之前,我运行以下代码:
  • i=1 对于formset.forms中的表单: 表单字段[“序列”]。初始值=i i+=1 除了一个问题外,这工作正常。当表单集被提交回视图进行保存时,使用表单集创建的所有5个额外字段都将填充一个序列值。当用户只想向路由添加2或3个碱基时,这会导致问题。验证错误弹出窗口,因为该表单的必填字段“base”为空。我可以在表单集发布后运行一些代码,检查是否存在基,如果不存在,则删除序列,但如果我要这样做,我也可以

  • 在发布表单集时运行一段代码,检查是否已输入基数,如果已输入,请添加序列,如果未输入,则将该字段留空。这样,当您尝试
    .save()
    表单集时,空值确保特定表单不会放入数据库。唯一的问题是,在运行
    .save(commit=False)
    之前,我无法对表单执行任何操作,因为表单集没有验证。但是我可以

  • 通过复制
    request.POST
    变量并手动设置序列来添加序列值,但这似乎非常不合理

  • 我也可以从我的一个
    RouteBase
    字段中删除
    blank=True
    ,但我真的不想这样做


  • 那么我应该在这里做什么呢?

    如果您不想让用户编辑序列字段并计划总是在后端计算它的值,您可以,而不是让它隐藏

    然后可以使用commit=False并根据需要处理序列字段的计算

    newPOST = request.POST.copy()
    i=1
    for index in range(0, int(request.POST["routebase_set-TOTAL_FORMS"])-1):
        if request.POST["routebase_set-" + str(index) + "-base"]:
            newPOST["routebase_set-" + str(index) + "-sequence"] = i
            i += 1
        else:
            newPOST["routebase_set-" + str(index) + "-sequence"] = ""
    

    老实说,这似乎比任何形式验证的混乱都要好。它也不像我想象的那么粗糙…

    这似乎不起作用。排除哪些字段无关紧要,如果没有序列,表单将不会验证,因此也不会
    。保存(commit=False)
    您需要在模型中为该字段设置blank=True。由于您自己(而不是用户)负责生成该值,因此不需要表单验证。-1这很难看。表单验证方法更简单、更干净。