ho creato una soluzione genetica per risolvere il problema dei parametri personalizzati per passare la finestra di pop-up. Hai solo bisogno di copiare questo codice sul vostro progetto:
from django.contrib.admin import widgets
class GenericRawIdWidget(widgets.ForeignKeyRawIdWidget):
url_params = []
def __init__(self, rel, admin_site, attrs=None, \
using=None, url_params=[]):
super(GenericRawIdWidget, self).__init__(
rel, admin_site, attrs=attrs, using=using)
self.url_params = url_params
def url_parameters(self):
"""
activate one or more filters by default
"""
res = super(GenericRawIdWidget, self).url_parameters()
res.update(**self.url_params)
return res
Quindi, è possibile utilizzare in questo modo:
field.widget = GenericRawIdWidget(YOURMODEL._meta.get_field('YOUR_RELATION').rel,
admin.site, url_params={"<YOURMODEL>__id__exact": object_id})
ho usato in questo modo:
class ANSRuleInline(admin.TabularInline):
model = ANSRule
form = ANSRuleInlineForm
extra = 1
raw_id_fields = ('parent',)
def __init__(self, *args, **kwargs):
super (ANSRuleInline,self).__init__(*args,**kwargs)
def formfield_for_dbfield(self, db_field, **kwargs):
formfield = super(ANSRuleInline, self).formfield_for_dbfield(db_field, **kwargs)
request = kwargs.get("request", None)
object_id = self.get_object(request)
if db_field.name == 'parent':
formfield.widget = GenericRawIdWidget(ANSRule._meta.get_field('parent').rel,
admin.site, url_params={"pathology__id__exact": object_id})
return formfield
def get_object(self, request):
object_id = request.META['PATH_INFO'].strip('/').split('/')[-1]
try:
object_id = int(object_id)
except ValueError:
return None
return object_id
quando uso GenericRawIdWidget
, ho passato un dettato a url_params, che verrà utilizzato nell'URL.
Mi piace questa risposta se il tipo è statico, sempre "PROJ". Ma come lo faresti se volessi che fosse dinamico, basato su un sito selezionato, per esempio. Nel modulo principale, si seleziona un sito. Quindi dovresti scegliere per raw_id_field in forma in linea di essere limitato a quel sito. Ma il problema che ho è, il modulo viene istanziato prima che l'utente abbia la possibilità di selezionare un sito – straykiwi