【问题标题】:django model inline dynamic default value for foreignKeyforeignKey 的 django 模型内联动态默认值
【发布时间】:2011-02-21 21:17:39
【问题描述】:

我在 models.py 中有这 3 个模型

class Customer(models.Model):
    name = models.CharField(max_length=50)
    ....

class Agent(django.contrib.auth.models.User):
    regions = models.CharField(max_length=50, choices={...})
    ....

class Payment(models.Model):
    added_by = models.ForeignKey(Agent)
    customer = models.ForeignKey(Customer)
    date = models.DateField(default=datetime.date.today())
    amount = models.IntegerField(default=0)

在我的 admin.py 中,我有这些类:

class PaymentInline(admin.TabularInline):
     model = Payment
     extra = 0

class CustomerAdmin(admin.ModelAdmin):
    inlines = [PaymentInline,]

问题#1: 是否可以在客户更改页面的“PaymentInline”中将“代理”字段预设为当前登录的代理。 我们可以预设 agent 字段的值,就像 django 对 'Customer' 字段所做的那样,它已经对内联隐藏了。

问题#2: 或者有没有办法在url中使用customer_id和agent_id“硬编码”来构建链接;在添加付款页面中,我们可以为客户字段和代理字段设置默认值和不可编辑值 例如, 这个 url[1] 将我们链接到正常的添加页面,但 customer_field 和 agent_feild 设置为 Agent.objects.get(id=1) 和 Customer.objects.get(id=1)。 (或者我们可以隐藏这两个字段,因为它们无论如何都是不可编辑的)

[1]http://localhost:8000/admin/my_app/payment/add/?customer_id=1&agent_id=1

有什么想法吗?

谢谢

最大

【问题讨论】:

    标签: django django-admin


    【解决方案1】:

    TabularInline 是一个 InlineModelAdmin,因此让我们定义 formfield_for_foreignkey():

    class PaymentInline(admin.TabularInline):
        def formfield_for_foreignkey(self, db_field, request, **kwargs):
            if db_field.name == 'added_by':
                kwargs['initial'] = request.user.id
                return db_field.formfield(**kwargs)
            return super(MyModelAdmin, self).formfield_for_foreignkey(
                db_field, request, **kwargs
            )
    

    【讨论】:

    • 此代码工作正常,但如果我们只想在下拉列表中显示登录用户而不显示任何其他用户。可以使用查询集,但它不会自动设置默认值,上面的代码做得很好。你能建议任何方法来做到这一点
    • @AkshayMukadam 超级老,但我认为您需要做的就是在分配 kwargs 初始值的位置下再添加一行:kwargs['queryset'] = User.objects.filter(id=request.user.id)
    【解决方案2】:

    第一季度: 我的猜测是编辑内联模板,隐藏代理列并将其默认设置为登录用户。 问题二: GET 参数默认传递给表单。 如果您想让某些字段不可编辑,我认为您需要更改模板以检查这些参数是否存在,然后隐藏这些字段(或不隐藏)。或者,您可以将不同的表单传递给 ModelAdmin 视图(也在检查是否存在 GET 选项之后)。

    托姆斯

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-22
      • 2020-09-05
      • 2021-06-05
      • 2011-09-03
      • 2022-06-17
      • 1970-01-01
      • 2017-02-18
      • 1970-01-01
      相关资源
      最近更新 更多