2012-04-16 13 views
13

मैं इन मॉडल:फिल्टर foreignkey क्षेत्र

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) 

मैं tryed है:

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) 

मैं जब व्यवस्थापक में इस तरह की कुछ बात कंपनी जोड़ने, फिल्टर करने के लिए विषय क्षेत्र चाहते हैं कई चीजें, लेकिन कोई भी काम नहीं किया! मैं यह कैसे कर सकता हूं?

+2

[इस सवाल] का जवाब देखें (http://stackoverflow.com/questions/3064368/how-to-limit-the-foreignkey-dropdown-with-constraints) –

उत्तर

25

render_change_form विधि का उपयोग करें:

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

'वापसी सुपर' पर अंतिम पंक्ति बदलें (CompanyAdmin, self) .render_change_form (अनुरोध, संदर्भ, * तर्क, ** kwargs) ' – madaboutcode

+1

' raw_id_fields' के साथ काम नहीं करता है। –

13

मैं वास्तव में तो जैसे get_form में यह करने के लिए पसंद करते हैं:

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

एक अन्य विकल्प कस्टम मॉडल प्रपत्र बनाने के लिए है, जहां theme की क्वेरीसमूह विशेषता क्षेत्र आपकी आवश्यकताओं को पूरा करने के लिए ठीक से ट्यून किया जाएगा।

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') 

इस मॉडल फॉर्म को django व्यवस्थापक क्षेत्र के बाहर भी पुन: उपयोग किया जा सकता है।

संबंधित मुद्दे