Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 8162711
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 6, 20262026-06-06T18:49:17+00:00 2026-06-06T18:49:17+00:00

Here in my django ModelAdmin I want to filter foreignkey choices based on current

  • 0

Here in my django ModelAdmin I want to filter foreignkey choices based on current user’s group and I want to achieve it both in add and change form. I have achieved it in add view by using following code.

add_view

def add_view(self, request, form_url = '', extra_context = None):
    service_sector = common.getServiceSector(request.user)
    ModelForm = self.get_form(request)
    if request.POST:
        form = ModelForm(request.POST, request.FILES)
    else:
        form = ModelForm()
    if service_sector:
        qs = form['member'].field.queryset
        qs = qs.filter(service_sector = service_sector)
        form['member'].field.queryset = qs
    adminForm = helpers.AdminForm(form, list(self.get_fieldsets(request)),
    self.prepopulated_fields, self.get_readonly_fields(request),
    model_admin=self)
    context = {
    'adminform': adminForm,
    'is_popup': "_popup" in request.REQUEST,
    'show_delete': False,
    'root_path': self.admin_site.root_path,
    }
    context.update(extra_context or {})
    return self.render_change_form(request, context, form_url=form_url, add=True)

Here it is working fine. In this model I have a unique field Email and that is causing the problem in change_view. I have given my change_view code below.

change_view

def change_view(self, request, object_id, form_url = '', extra_context = None):
    qs = self.model._default_manager.get_query_set()

    service_sector = common.getServiceSector(request.user)
    bene_object = Beneficiary.objects.get(pk=object_id)
    ModelForm = self.get_form(request, bene_object)
    if request.POST:
        form = ModelForm(request.POST, request.FILES)
    else:                     

        form = ModelForm(instance=bene_object)            
    if service_sector:
        qs = form['member'].field.queryset
        qs = qs.filter(service_sector = service_sector)
        form['member'].field.queryset = qs
    adminForm = helpers.AdminForm(form, list(self.get_fieldsets(request)),
    self.prepopulated_fields, self.get_readonly_fields(request),
    model_admin=self)
    context = {
    'adminform': adminForm,
    'is_popup': "_popup" in request.REQUEST,
    'show_delete': False,
    'root_path': self.admin_site.root_path,
    }
    context.update(extra_context or {})
    return self.render_change_form(request, context, form_url = form_url, change = True)

Even though I have given change = True in my change_view return, it is trying to save the object as new one. So I’m getting an error Email already exists as the email field is unique value field. Or is it possible to use the normal change_view return as follows:

return super(ModelAdmin, self).change_view(request, form_url, extra_context)

If so, how can I filter foreignkey choices. Or how to use render_change_form to achieve this? Thanks in advance.

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-06T18:49:19+00:00Added an answer on June 6, 2026 at 6:49 pm

    I have resolved this issue and posting the answer here which may help others. The question here helped me to fix this issue. With the following code I have done foreignkey filter based on user’s group, for both add and change form in django admin with inline formsets in it. I’m giving the code below:

    def render_change_form(self, request, context, *args, **kwargs):
        model = self.model
        opts = model._meta
        formsets = []
    
        #Change view
        if 'change' in kwargs.keys():
            object_id   = kwargs['obj'].id  #To get object id
            object      = Modelobjects.get(pk=object_id)
            ModelForm   = self.get_form(request, object)
            qs          = self.model._default_manager.get_query_set()
            if request.POST:
                form = ModelForm(request.POST, request.FILES)
            else:
                form = ModelForm(instance = object)
            service_sector = common.getServiceSector(request.user)
            if service_sector:
                #To filter foreignkey
                qs = form['member'].field.queryset
                qs = qs.filter(service_sector = service_sector)
                form['member'].field.queryset = qs
            adminForm = helpers.AdminForm(form, list(self.get_fieldsets(request)),
            self.prepopulated_fields, self.get_readonly_fields(request),
            model_admin=self)
            media = self.media + adminForm.media
    
            #To get inline formsets used
            prefixes = {}
            for FormSet, inline in zip(self.get_formsets(request),
                                       self.inline_instances):
                prefix = FormSet.get_default_prefix()
                prefixes[prefix] = prefixes.get(prefix, 0) + 1
                if prefixes[prefix] != 1:
                    prefix = "%s-%s" % (prefix, prefixes[prefix])
                formset = FormSet(instance=object, prefix=prefix,
                                  queryset=inline.queryset(request))
                formsets.append(formset)
    
            inline_admin_formsets = []
            for inline, formset in zip(self.inline_instances, formsets):
                fieldsets = list(inline.get_fieldsets(request))
                readonly = list(inline.get_readonly_fields(request))
                inline_admin_formset = helpers.InlineAdminFormSet(inline, formset,
                    fieldsets, readonly, model_admin=self)
                inline_admin_formsets.append(inline_admin_formset)
                media = media + inline_admin_formset.media
    
        else:
            #Add view
            ModelForm   = self.get_form(request)
            qs          = self.model._default_manager.get_query_set()
            if request.POST:
                form = ModelForm(request.POST, request.FILES)
            else:
                form = ModelForm()
            service_sector = common.getServiceSector(request.user)
            if service_sector:
                qs = form['member'].field.queryset
                qs = qs.filter(service_sector = service_sector)
                form['member'].field.queryset = qs
            adminForm = helpers.AdminForm(form, list(self.get_fieldsets(request)),
            self.prepopulated_fields, self.get_readonly_fields(request),
            model_admin=self)
            media = self.media + adminForm.media
    
            prefixes = {}
            for FormSet, inline in zip(self.get_formsets(request),
                                       self.inline_instances):
                prefix = FormSet.get_default_prefix()
                prefixes[prefix] = prefixes.get(prefix, 0) + 1
                if prefixes[prefix] != 1:
                    prefix = "%s-%s" % (prefix, prefixes[prefix])
                formset = FormSet(instance=self.model(), prefix=prefix,
                                  queryset=inline.queryset(request))
                formsets.append(formset)
    
            inline_admin_formsets = []
            for inline, formset in zip(self.inline_instances, formsets):
                fieldsets = list(inline.get_fieldsets(request))
                readonly = list(inline.get_readonly_fields(request))
                inline_admin_formset = helpers.InlineAdminFormSet(inline, formset,
                    fieldsets, readonly, model_admin=self)
                inline_admin_formsets.append(inline_admin_formset)
                media = media + inline_admin_formset.media
    
        context = {
        'adminform': adminForm,
        'title': _('Add %s') % force_unicode(opts.verbose_name),
        'is_popup': "_popup" in request.REQUEST,
        'show_delete': False,
        'media': mark_safe(media),
        'inline_admin_formsets': inline_admin_formsets,
        'root_path': self.admin_site.root_path,
        }
        return super(ModelAdmin, self).render_change_form(request, context, args, kwargs)
    

    Here the object id is obtained from kwargs['obj'].id and foreignkey is filtered by

    qs = form['member'].field.queryset
    qs = qs.filter(service_sector = service_sector)
    form['member'].field.queryset = qs
    

    Here common.getServiceSector is a custom method I’m using for my foreignkey filter conditions. You can define your own method for your requirements. Hope this will be helpful to others. Thanks.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

Django newbie here I know that I can change the encoding of a table
Here is a Django model I'm using. class Person(models.Model): surname = models.CharField(max_length=255, null=True, blank=True)
I am following the django tutorial here . I have copied everything exactly. After
Here's part of my Django app's models.py : class Person(models.Model): birth_year = WideYear(null=True, blank=True)
here is my code: urls.py: from django.conf.urls import patterns from views import show,showpage urlpatterns
Here is a part of my html code (video urls marked with a django-template
I'm trying to follow the Django tutorial (for v1.1) here . the problem that
I'm trying to deploy my django project on a shared hosting as describe here
I need some opinions here. I'm working on a Django project using buildout to
In Django Admin i want to display the sum of all action durations. I

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.