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.