【问题标题】:django admin - populate field with callabledjango admin - 使用可调用填充字段
【发布时间】:2011-09-23 00:03:24
【问题描述】:

除了这个例子,我找不到任何人这样做的一个例子,除了知道代码需要放在哪里之外,这对我没有帮助。

How to prepopulate UserProfile fields in the Django admin?

这是我的代码

class QuoteMaterial(models.Model):
    name = models.CharField(_('name'), max_length=255)
    content = models.TextField(_('content'),
                           help_text=_('A static priced item used when doing a job. Selectable when creating a quote. '))
    price = models.DecimalField(_('price'), max_digits=6, help_text="not sure if this is before or after VAT yet", decimal_places=2, default="0.00")

    def get_companies():
        return CompanyProfile.objects.filter(user=request.user)

    company = models.ForeignKey(CompanyProfile, default=get_companies) 

如果不明显,我尝试在管理部分使用属于已登录用户的可用公司填充下拉列表。

我的问题是我不知道如何将请求对象传递给“get_companies”。任何人都知道任何例子。

【问题讨论】:

    标签: python django django-admin


    【解决方案1】:

    您必须在扩展ModelAdmin 的管理类中执行此覆盖,而不是在扩展models.Model 的类中。具体来说,您需要覆盖formfield_for_foreignkey

    来自the docs

    class MyModelAdmin(admin.ModelAdmin):
        def formfield_for_foreignkey(self, db_field, request, **kwargs):
            if db_field.name == "car":
                kwargs["queryset"] = Car.objects.filter(owner=request.user)
        return super(MyModelAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
    

    对于你的情况,它看起来像:

    if db_field.name == "company":
        kwargs['queryset'] = request.user.company_set.all()
    

    【讨论】:

    • 我不确定字段的默认值是否不适用于已经存在的模型字段。即使是,您也需要返回一个字段对象,而不仅仅是一个查询集。这种方法的另一个问题是,正如您正确指出的那样,您如何在模型中获取请求。
    • 对粗鲁的评论表示歉意,编辑超时,我在按 Enter 后离开了,没有意识到它超时。我看到我现在不能做我想做的事,我要为这个网站建立一个前端,我想这只是意味着用户将能够看到其他人的公司名称。我猜这不是一个直接的问题。
    • 终于重新阅读了你上面的解决方案,你已经一针见血了,谢谢。
    【解决方案2】:

    你混淆了术语。

    “预填充”是指从另一个字段填充一个字段。这不是您为管理弹出窗口过滤内容的方式,因为您实际上并没有设置字段,而只是限制选择并让用户从中设置字段。

    此外,字段的default 值需要是一个常量,因为它会向下传递到数据库,而数据库不能使用查询来设置默认值。

    真正想要的是你的ForeignKeylimit_choices_to (docs) 参数,但即便如此,你也不能为此使用request;它必须使用模型中的字段来工作。这样做的原因是,如果你基于用户,那么一些用户将无法选择另一个用户设置的当前值。例如,当用户只想更改 content 时,您不希望 company 自行更改,因为 user 不会在过滤器中生成当前的 company

    【讨论】:

      猜你喜欢
      • 2013-04-24
      • 2013-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-10
      • 2012-05-12
      • 2017-03-17
      相关资源
      最近更新 更多