6

我有一个从 ModelForm 继承的表单:

class ChildModel(ModelForm):
      class Meta:
          model = Documents
          fields = ('secretdocs')
          widgets = {
              'secretdocs': Select(attrs={'class': 'select'}),
          }

模型“secretdocs”有一个 uid。但是当它打印出选择和选项时,选项值显示如下:

<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 方法,但我很确定这不是正确的方法。有谁知道我该怎么做?

提前致谢。

4

2 回答 2

16

你可以这样做:

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'}),
      }
于 2013-04-12T01:09:45.727 回答
2

我认为这样做的“正确”方法的一部分是确保将 UUID 字段设置为相关模型的主键,并且没有自动编号 ID 字段。

例如:

class Document(models.Model):
    uuid = models.YourCustomUUIDField(primary_key=True,.....)
    other_field = models.CharField(.....)
    ....

如果你这样做,我认为 Django 会选择 UUID 字段作为主键并在所有地方使用它。但是,如果您确实希望保留内置的自动递增主键字段并仅在此处使用 UUID,您可以执行类似于 karthikr 在需要 UUID 字段的表单中建议的操作。

于 2013-04-12T02:05:48.413 回答