django admin使用foreignkey筛选器覆盖change_视图
在我的django ModelAdmin中,我想根据当前用户的组筛选foreignkey选项,我想以添加和更改的形式实现它。我使用以下代码在addview中实现了它 添加视图django admin使用foreignkey筛选器覆盖change_视图,django,django-admin,Django,Django Admin,在我的django ModelAdmin中,我想根据当前用户的组筛选foreignkey选项,我想以添加和更改的形式实现它。我使用以下代码在addview中实现了它 添加视图 def add_view(self, request, form_url = '', extra_context = None): service_sector = common.getServiceSector(request.user) ModelForm = self.get_form(request
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)
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)
在这里,它工作得很好。在这个模型中,我有一个独特的字段Email,这导致了change\u视图中的问题。我在下面给出了我的更改视图代码
更改视图
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)
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)
即使我在change\u视图返回中给出了change=True
,它仍试图将对象另存为新对象。因此,我得到一个错误电子邮件已经存在
,因为电子邮件字段是唯一值字段。或者是否可以按如下方式使用正常的更改视图返回:
return super(ModelAdmin, self).change_view(request, form_url, extra_context)
如果是,我如何筛选foreignkey选项。或者如何使用
render\u change\u form
来实现这一点?提前感谢。我已经解决了这个问题,并在这里发布了答案,这可能对其他人有所帮助。这个问题帮助我解决了这个问题。使用下面的代码,我基于用户组对django admin中包含内联表单集的add和change表单进行了foreignkey筛选。我给出的代码如下:
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)
在这里,对象id是从kwargs['obj']获得的。id和foreignkey由
qs = form['member'].field.queryset
qs = qs.filter(service_sector = service_sector)
form['member'].field.queryset = qs
这里的
common.getServiceSector
是我用于foreignkey筛选条件的自定义方法。您可以根据自己的需求定义自己的方法。希望这对其他人有帮助。谢谢。我已经解决了这个问题,并将答案发布在这里,这可能会对其他人有所帮助。这个问题帮助我解决了这个问题。使用下面的代码,我基于用户组对django admin中包含内联表单集的add和change表单进行了foreignkey筛选。我给出的代码如下:
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)
在这里,对象id是从kwargs['obj']获得的。id和foreignkey由
qs = form['member'].field.queryset
qs = qs.filter(service_sector = service_sector)
form['member'].field.queryset = qs
这里的common.getServiceSector
是我用于foreignkey筛选条件的自定义方法。您可以根据自己的需求定义自己的方法。希望这对其他人有帮助。谢谢