【问题标题】:widgets in django admindjango admin 中的小部件
【发布时间】:2011-01-06 18:06:28
【问题描述】:

我需要一个可以使外键只读的小部件,并且它应该显示与该字段相关的值而不是 id

假设

Class A(models.Model):
   id=models.AutoField(primary_key=True)
   name=models.CharField(max_length=200)

   def __unicode__(self):
     return self.name

Class B(models.Model):

   id=models.AutoField(primary_key=True)
   name=models.ForeignKey(A)
   description=models.CharField(max_length=200)

现在,当我将 B 类的“名称”设为只读时,在管理员中它只显示 A 类中该名称的 id 对应值。是否有任何小部件可以将该字段设为只读并显示值不是 id

【问题讨论】:

    标签: django django-admin


    【解决方案1】:

    第三种解决方法是使用 Django 主干,它将 readonly_fields 属性添加到 ModelAdmin。 其他替代方法是使用此补丁修补当前版本的 django:http://code.djangoproject.com/ticket/342

    编辑:我正在使用 django r12204,因为后来的修订破坏了 django-cms 应用程序,这对我来说至关重要。我认为 django 的后来版本有这个,但我必须修补我的 django 安装以显示外键值而不是 id。但似乎这种行为仍然存在于 django 主干中,所以这里是补丁:http://dpaste.com/hold/147814/

    【讨论】:

    • 如果我在模型管理中使用 readonly_field 那么它也会显示 Id 而不是值。
    • 我遇到了同样的问题。我最终破解了 django 管理员的代码来显示对象的外键值 - 这是我的差异:dpaste.com/hold/147814
    • 只能描述一点。我不知道在哪里复制该代码
    【解决方案2】:

    如果我在 help_text 中显示值怎么办。意味着我在 help_text 中显示值以及 Id

    这可以很简单地实现

    def get_form(self, request, obj=None):
        form = super(BAdmin,self).get_form(request, obj)
        link = obj.id
        pl=A.objects.get(id=obj.name_id)
        help_text1 = "%s"%(pl.name)
        form.base_fields['name'].help_text = help_text1
        return form
    

    【讨论】:

      【解决方案3】:

      作为一种解决方法,您可以:

      1) 将字段name添加到ModelAdmin的raw_id_fields属性中,然后

      2) 使用 javascript 禁用 id 输入框(保持值标签不变)。

      除了安全问题(如果有人模仿禁用/删除的输入框)之外,它会按照您的要求进行操作。这可以另外处理,例如在从ModelForm 继承的类的clean_name 函数中。

      【讨论】:

      • 我不想使用 javascript
      猜你喜欢
      • 2010-10-13
      • 1970-01-01
      • 2013-09-15
      • 2018-09-19
      • 1970-01-01
      • 2012-09-02
      • 2016-03-13
      • 2013-03-05
      • 2010-10-14
      相关资源
      最近更新 更多