如何在运行时设置Django ModelForm的可见字段?
我有一个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') )