答案 0 :(得分:9)
经过一番挖掘,我们能够获取传递给管理视图的参数(在被django admin的urls.py解析之后)并使用它(self_pub_id)来获取对象:
class PublicationAdmin(admin.ModelAdmin):
def formfield_for_manytomany(self, db_field, request, **kwargs):
if db_field.name == "authors":
#this line below got the proper primary key for our object of interest
self_pub_id = request.resolver_match.args[0]
#then we did some stuff you don't care about
pub = Publication.objects.get(id=self_pub_id)
kwargs["queryset"] = pub.authors.all()
return super(PublicationAdmin, self).formfield_for_manytomany(db_field, request, **kwargs)
更优雅的解决方案是使用已接受的答案推荐并利用get_form ModelAdmin成员函数。像这样:
class ProfileAdmin(admin.ModelAdmin):
my_id_for_formfield = None
def get_form(self, request, obj=None, **kwargs):
if obj:
self.my_id_for_formfield = obj.id
return super(ProfileAdmin, self).get_form(request, obj, **kwargs)
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == "person":
kwargs["queryset"] = Person.objects.filter(profile=self.my_id_for_formfield)
return super(ProfileAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
答案 1 :(得分:8)
答案 2 :(得分:3)
我通过重写change_view()
class CartAdmin(admin.ModelAdmin):
def change_view(self, request, object_id, form_url='', extra_context=None):
self.object_id = object_id
return self.changeform_view(request, object_id, form_url, extra_context)
def formfield_for_foreignkey(self, db_field, request, **kwargs):
print self.object_id
return super(CartAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
然后您可以在self.object_id
formfield_for_foreignkey()
答案 3 :(得分:1)
以下代码段将为您提供对象ID:
request.resolver_match.kwargs['object_id']
示例用法:(我正在过滤显示的电话号码,只显示客户的电话号码
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == 'preferred_contact_number':
kwargs['queryset'] = CustomerPhone.objects.filter(customer__pk=request.resolver_match.kwargs['object_id'])
return super().formfield_for_foreignkey(db_field, request, **kwargs)
P.S:通过调试并遍历可访问变量来找到它。
答案 4 :(得分:0)
一种更通用的方法可能是编写一个辅助方法来获取模型实例(如果有),就像您通常使用(有界的)ModelForm一样,然后从中检索id或任何其他属性:
from django.contrib import admin
class MyModelAdmin(admin.ModelAdmin):
def get_instance(self, request):
try:
object_id = request.resolver_match.kwargs['object_id']
obj = self.get_object(request, object_id)
except:
obj = None
return obj
答案 5 :(得分:-1)
我通过在model.py中创建一个返回ID
的property()来实现它models.py:
class MyModel(models.Model):
myfield = models.CharField(max_length=75)
...
def get_id(self):
return str(self.id)
getid = property(get_id)
admin.py:
from myapp.models import MyModel
class MyModelAdmin(admin.ModelAdmin):
list_display = ['mylink',]
def mylink(self, object):
return '<a href="http://mywebsite/'+object.getid+'/">Edit</a>'
mylink.allow_tags = True
admin.site.register(MyModel, MyModelAdmin)
答案 6 :(得分:-2)
我正在处理类似的情况,并且意识到我需要的ID,我可以从模型中获取它自己,因为它是该模型的外键。所以它会是这样的:
cpu = CompanyUser.objects.filter(company__id=self.company_id)
或模型的结构决定了什么。