【问题标题】:Django: using ForeignKeyRawIdWidget outside of admin formsDjango:在管理表单之外使用 ForeignKeyRawIdWidget
【发布时间】:2011-01-17 06:48:36
【问题描述】:

我正在尝试查找一些有关如何在我自己的表单中使用 ForeignKeyRawIdWidget 的文档。目前我不断收到错误消息,“init() 至少需要 2 个非关键字参数(给定 1 个)”,这并没有告诉我什么。

任何帮助将不胜感激。谷歌搜索这个结果很少,但只有开发对话,没有我能找到如何实现它的示例。

更新:已解决;请参阅下面的解决方案。

【问题讨论】:

  • 您能展示一下您是如何尝试初始化小部件的吗?
  • 如果您自己解决了这个问题,请将您的解决方案作为答案发布并接受。在问题中包含解决方案是令人困惑的。
  • 更好?谢谢指点。

标签: django forms admin widget


【解决方案1】:

从 Django 1.5 开始,这可以在非管理员表单中重用 ForeignKeyRawIdWidget。

from django.contrib.admin.sites import site

class InvoiceForm(ModelForm):
    class Meta:
        model = Invoice
        widgets = {
            'customer': ForeignKeyRawIdWidget(Invoice._meta.get_field('customer').rel, site),
        }

更新

Django 2.0 正在弃用 field.rel 以支持 field.remote_field。您可能想改用它(也适用于 Django 1.11):

...
ForeignKeyRawIdWidget(Invoice._meta.get_field('customer').remote_field, site),
...

【讨论】:

  • 在 Django 2.0 中 rel 已被弃用 (RemovedInDjango20Warning: Usage of field.rel has been deprecated. Use field.remote_field instead.)。您可能需要编辑答案以使其保持最新状态。
  • 也适用于新的小部件AutocompleteSelect
【解决方案2】:

这是来自源代码(django.contrib.admin.widgets):

class ForeignKeyRawIdWidget(forms.TextInput):
    """
    A Widget for displaying ForeignKeys in the "raw_id" interface rather than
    in a <select> box.
    """
    def __init__(self, rel, attrs=None):
        self.rel = rel
        super(ForeignKeyRawIdWidget, self).__init__(attrs)

    #.....

从剩下的代码中,我猜rel 是您模型的外键字段。有一次,代码会检查 self.rel.limit_choices_to,而这个属性 (limit_choices_to) 只能在 ForgeinKey 字段上设置。

【讨论】:

  • 我也查看了这段代码...不完全是我希望的示例或文档!当您什么都没有得到时,很难进行故障排除。
猜你喜欢
  • 2015-04-22
  • 1970-01-01
  • 2016-09-10
  • 1970-01-01
  • 1970-01-01
  • 2011-01-19
  • 2018-02-09
  • 1970-01-01
相关资源
最近更新 更多