Se il person
non può essere facilmente ottenuto da request
, potrebbe essere necessario passare manualmente sovrascrivendo ModelAdmin.get_form()
o InlineModelAdmin.get_formset()
:
from functools import partial
class MyModelAdmin(admin.ModelAdmin):
def get_form(self, request, obj=None, **kwargs):
kwargs['formfield_callback'] = partial(self.formfield_for_dbfield, request=request, obj=obj)
return super(MyModelAdmin, self).get_form(request, obj, **kwargs)
def formfield_for_dbfield(self, db_field, **kwargs):
person = kwargs.pop('obj', None)
formfield = super(MyModelAdmin, self).formfield_for_dbfield(db_field, **kwargs)
if db_field.name == "car" and person:
formfield.queryset = Cars.objects.filter(owner=person)
return formfield
# or its inline
class MyInlineModelAdmin(admin.StackedInline):
def get_formset(self, request, obj=None, **kwargs):
kwargs['formfield_callback'] = partial(self.formfield_for_dbfield, request=request, obj=obj)
return super(MyInlineModelAdmin, self).get_formset(request, obj, **kwargs)
def formfield_for_dbfield(self, db_field, **kwargs):
person = kwargs.pop('obj', None)
formfield = super(MyInlineModelAdmin, self).formfield_for_dbfield(db_field, **kwargs)
if db_field.name == "car" and person:
formfield.queryset = Cars.objects.filter(owner=person)
return formfield
O
class MyModelAdmin(admin.ModelAdmin):
def get_form(self, request, obj=None, **kwargs):
kwargs['formfield_callback'] = partial(self.formfield_for_dbfield, request=request, obj=obj)
return super(MyModelAdmin, self).get_form(request, obj, **kwargs)
def formfield_for_dbfield(self, db_field, **kwargs):
if db_field.name != "car":
kwargs.pop('obj', None)
return super(MyModelAdmin, self).formfield_for_dbfield(db_field, **kwargs)
def formfield_for_manytomany(self, db_field, request=None, **kwargs):
person = kwargs.pop('obj', None)
if db_field.name == "car" and person:
kwargs['queryset'] = Cars.objects.filter(owner=person)
return super(MyModelAdmin, self).formfield_for_manytomany(db_field, request, **kwargs)
non capisco. cosa è 'formfield_callback' e cosa è' partial' – user192082107
Il callback è la magia dietro le quinte per invocare 'formfield_for_manytomany', dobbiamo passarlo manualmente' obj', per ottenere 'obj' da' kwargs' all'interno ' formfield_for_manytomany'. La parte 'partial' crea una funzione di ordine elevato che, quando viene chiamata' formfield_callback (some_more_arguments) ', si comporta come' self.formfield_for_dbfield (request, some_more_arguments) ', puoi controllare [il doc] (http: // docs .python.org/2/library/functools.html # functools.partial) e [il post] (http://stackoverflow.com/questions/3252228/python-why-is-functools-partial-necessario) – okm
Tutto è andando sopra la mia testa. Ho due Theseosn 1. Da qui posso ottenere maggiori informazioni su 'formfield_callback'. è costruito in django o nella sua usanza 2. come cna so quali sono le cose o campi o funzioni disponibili all'interno di kwargs. come fai a sapere che obj è in kwargs – user192082107