django model inline动态默认值为foreignKey

时间:2011-02-21 21:17:40

标签: django django-admin

我在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”中将“代理”字段预先设置为当前登录的代理。 我们可以预设代理字段的值,就像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://本地主机:8000 /管理/程序my_app /支付/添加/ CUSTOMER_ID = 1&安培; AGENT_ID = 1

有什么想法吗?

由于

最高

2 个答案:

答案 0 :(得分:3)

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
        )

答案 1 :(得分:1)

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

Tomus