我在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
有什么想法吗?
由于
最高
答案 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