带有 Select Widget 的 Django ModelForm - 使用 object.uid 作为默认选项值而不是 object.id

Posted

技术标签:

【中文标题】带有 Select Widget 的 Django ModelForm - 使用 object.uid 作为默认选项值而不是 object.id【英文标题】:Django ModelForm with Select Widget - Use object.uid as default option value instead of object.id 【发布时间】:2013-04-04 08:45:51 【问题描述】:

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

提前致谢。

【问题讨论】:

【参考方案1】:

你可以这样做:

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'),
      

【讨论】:

虽然这在 uid 显示中确实有效,但似乎我无法使用以前有效的相同查询过滤我的查询集。平心而论,我对 Django 很陌生,所以也许我需要添加一些额外的东西? 是的 - 只需将 Document.objects.all() 替换为您之前的过滤条件 需要当前用户过滤。我认为这可以使用 lambdas 来完成,对吗?我现在没有时间尝试,但我会尽快调查。 好吧.. 您可以在__init__ 中轻松做到这一点,了解如何将请求对象放入初始化上下文并在那里加载选项。 找到了这个链接,它帮助我完成了这个过程:***.com/questions/3010489/…。这还没有 100% 完成,但我已经取得了一些不错的进展。【参考方案2】:

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

例如:

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

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

【讨论】:

相信我,我很想这样做,但我还需要更改其他部分。

以上是关于带有 Select Widget 的 Django ModelForm - 使用 object.uid 作为默认选项值而不是 object.id的主要内容,如果未能解决你的问题,请参考以下文章

带有动态表单的 Django FormWizard

Django 表单 ChoiceField 依赖于另一个 ChoiceField

使用 django-select2 获取带有图片的下拉列表

带有 Select2 远程数据示例的 Django

带有连接的 Django ORM SELECT

Django之form