如何在运行时设置Django ModelForm的可见字段?

3 投票
1 回答
1211 浏览
提问于 2025-04-16 01:28

我有一个Django模型:

class Customer(models.Model):
  first_name=models.CharField(max_length=20,null=True, blank=True)
  last_name=models.CharField(max_length=25,null=True, blank=True)
  address=models.CharField(max_length=60,null=True, blank=True)
  address2=models.CharField(max_length=60,null=True, blank=True)
  city=models.CharField(max_length=40,null=True, blank=True)
  state=models.CharField(max_length=2,null=True, blank=True)

从这个模型,我创建了一个ModelForm:

class CustomerForm(forms.ModelForm):
  class Meta:
    model=Customer

我想在我的模板中显示一些表单的部分,具体对应用户可以更改的信息。例如,如果我想让客户更改他们的名字,我希望能显示一个只包含'first_name'和'last_name'字段的表单。

实现这个目标的一种方法是为每个不同的字段片段创建一个ModelForm……以名字为例,它可能看起来像这样:

class CustomerFormName(forms.ModelForm):
  class Meta:
    model=Customer
    fields=('first_name','last_name')

不过,这样做似乎不太优雅,也不够灵活。我希望能在运行时指定字段,也就是说,当我把字典从视图传递到模板时,我可以直接设置想要显示的字段。我该如何设置才能在运行时为表单指定字段呢?理想情况下,我希望最终传递的字典看起来像这样:

{'name_change_form':CustomerFormName(<form with only first_name and last_name>), 'address_change_form':CustomerFormName(<form with only address fields>)}

这样,我就知道每当我输出name_change_form.as_p时,它将正好包含我想要的表单字段。

有什么想法吗?也欢迎推荐更好的方法。

1 个回答

4

这段代码是用来处理某种数据的。它可能涉及到一些特定的操作,比如读取文件、处理字符串或者进行计算。具体来说,代码块中的内容会告诉你如何一步一步地完成这些操作。

如果你是编程新手,理解这些代码的每一行可能会有点困难,但没关系。你可以逐行分析,看看每一部分是做什么的。通常,代码会有注释,帮助你理解每个步骤的目的。

总之,这段代码的目的是为了让你能够更好地处理和管理数据,虽然一开始可能看起来有点复杂,但只要慢慢来,你一定能掌握它。

from django.forms import ModelForm
from wherever import Customer
def formClassFactory(model,fields):
  ff = fields
  mm = model
  class formClass(ModelForm):
    class Meta:
      model  = mm
      fields = ff
  return formClass
form_class = formClassFactory( ('first_name','last_name') )

撰写回答