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, )
创建此表单集时,序列字段为空。我需要在保存表单集之前用值填充它(否则它将无法验证)。我可以想出四种方法来解决这个问题
.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这很难看。表单验证方法更简单、更干净。