我有一个继承自ModelForm的表单:
class ChildModel(ModelForm):
class Meta:
model = Documents
fields = ('secretdocs')
widgets = {
'secretdocs': Select(attrs={'class': 'select'}),
}
模型“secretdocs”有一个uid。但是当它打印出select和option时,选项值显示为:
<select class="select" id="id_secretdocs" name="secretdocs">
<option value="1">My Secret Doc</option>
</select>
但是我希望它具有选项的uid:
<select class="select" id="id_secretdocs" name="secretdocs">
<option value="cd2feb4a-58cc-49e7-b46e-e2702c8558fd">My Secret Doc</option>
</select>
到目前为止,我试图使用BaseForm的数据对象并覆盖Select的value_from_datadict方法,但我很确定这不是正确的方法。有谁知道我怎么能这样做?
提前致谢。
答案 0 :(得分:11)
您可以这样做:
class ChildModel(ModelForm):
secretdocs = forms.ChoiceField(choices=[(doc.uid, doc.name) for doc in Document.objects.all()])
class Meta:
model = Documents
fields = ('secretdocs', )
widgets = {
'secretdocs': Select(attrs={'class': 'select'}),
}
答案 1 :(得分:2)
我认为执行此操作的“正确”方法的一部分是确保将UUID字段设置为相关模型的主键,并且没有自动编号ID字段。
例如:
class Document(models.Model):
uuid = models.YourCustomUUIDField(primary_key=True,.....)
other_field = models.CharField(.....)
....
如果你这样做,我认为Django将把UUID字段作为主键并在所有地方使用它。但是,如果您确实希望保留内置自动增量主键字段并仅在此处使用UUID,则可以执行类似于karthikr在需要UUID字段的表单中建议的内容。