2012-04-16 16 views
13

tengo estos modelos:filtro de campo ForeignKey de administración de Django

class Entity(models.Model): 
     name=models.CharField(max_length=100) 

class Theme(models.Model): 
    name=models.CharField(max_length=100) 
    entity=models.OneToOneField(Entity) 

class Company(models.Model): 
    name=models.CharField(max_length=100) 
    theme=models.OneToOneField(Theme,null=True,blank=True) 

quiero filtrar el campo temático al añadir compañía en administración, algo como esto:

class CompanyAdmin(admin.ModelAdmin): 
    def queryset(self, request): 
     qs = super(CompanyAdmin, self).queryset(request) 
     qs.theme.queryset = Theme.objects.filter(name__iexact='company') 
     return qs 

admin.site.register(Company,CompanyAdmin) 

He tryed muchas cosas, pero nadie trabajó! ¿cómo puedo hacer esto?

+2

Vea la respuesta a [esta pregunta] (http://stackoverflow.com/questions/3064368/how-to-limit-the-foreignkey-dropdown-with-constraints) –

Respuesta

25

Utilice la render_change_form método:

class CompanyAdmin(admin.ModelAdmin): 
    def render_change_form(self, request, context, *args, **kwargs): 
     context['adminform'].form.fields['theme'].queryset = Theme.objects.filter(name__iexact='company') 
     return super(CompanyAdmin, self).render_change_form(request, context, *args, **kwargs) 
+1

Cambie la última línea a 'return super (CompanyAdmin, self) .render_change_form (request, context, * args, ** kwargs) ' – madaboutcode

+1

No funciona con' raw_id_fields'. –

13

realidad, yo prefiero hacerlo en get_form así:

class CompanyAdmin(admin.ModelAdmin): 
    def get_form(self, request, obj=None, **kwargs): 
     form = super(CompanyAdmin, self).get_form(request, obj, **kwargs) 
     form.base_fields['theme'].queryset = Theme.objects.filter(name__iexact='company') 
     return form 
1

Otra opción es crear un formulario modelo personalizado donde el atributo queryset del theme el campo se ajustará para satisfacer sus necesidades.

class CompanyForm(ModelForm): 
    class Meta: 
     model = CompanyForm 
     fields = __all__ # or a tuple of fields 

    def __init__(self, *args, **kwargs): 
     super(CompanyForm, self).__init__(*args, **kwargs) 
     if self.instance: # Editing and existing instance 
      self.fields['theme'].queryset = Theme.objects.filter(name__iexact='company') 

Este modelo también se puede reutilizar fuera del área de administración de django.

Cuestiones relacionadas