ここで私の django ModelAdmin では、現在のユーザーのグループに基づいて外部キーの選択をフィルタリングし、追加と変更の両方の形式でそれを実現したいと考えています。次のコードを使用して、追加ビューでそれを達成しました。
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)
ここでは、正常に動作しています。このモデルには、一意のフィールドEmailがあり、それが change_view で問題を引き起こしています。以下に 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)
change_view をchange = True
返しましたが、オブジェクトを新しいオブジェクトとして保存しようとしています。Email already exists
メール フィールドが一意の値フィールドであるため、エラーが発生します。または、次のように通常の change_view リターンを使用することは可能ですか:
return super(ModelAdmin, self).change_view(request, form_url, extra_context)
もしそうなら、どうすれば外部キーの選択肢をフィルタリングできますか。または、render_change_form
これを達成するためにどのように使用しますか? 前もって感謝します。