如何在 ModelResource django-import-export 中获取请求
How to get request in ModelResource django-import-export
如何从django-import-export中ModelResource的方法queryset获取request.user?
class PeopleResource(ModelResource):
class Meta:
model = People
exclude = ('id','agent', 'public_id', 'active')
def dehydrate_placeA(self, people):
...
...
def get_queryset(self):
query = People.objects.filter( ..... request.user )
return query
问题已解决。我忘记了我之前在我的视图中调用了people_resource.export()
。现在更容易了,因为我只是在方法 export()
中传递了 variabel kwargs,并在模型 PeopleResource
中覆盖了 def export()
。所以我的解决方案就在这里。
views.py
def export_excel(request):
...
people_resource = PeopleResource()
dataset = people_resource.export(agent=request.user.agent,)
...
models.py
class PeopleResource(ModelResource):
class Meta:
model = People
exclude = ('id','agent', 'public_id', 'active')
...
...
def export(self, queryset=None, *args, **kwargs):
queryset = People.objects.filter(agent=kwargs['agent'])
return super(PeopleResource, self).export(queryset, *args, **kwargs)
我正在寻找类似的东西。我希望根据管理员中导出的请求将请求对象附加到 Resource 实例,以便我可以检查它并根据查询参数动态影响功能。如果您想根据用户动态更改它,这也将非常有用。它最终变得非常简单:
首先,subclass ModelResource class 并寻找新的 kwarg:
from import_export import resources
class RequestModelResource(resources.ModelResource):
def __init__(self, *args, **kwargs):
self.request = kwargs.pop('request', None)
super(RequestModelResource, self).__init__(*args, **kwargs)
然后,在 import-export 中有一个相关的管理方法可以用来传递 kwargs。 See here。将此添加到继承自 import_export.admin.ImportExportModelAdmin
:
的 ModelAdmin
class MyModelAdmin(ImportExportModelAdmin):
resource_class = MyModelResource
def get_resource_kwargs(self, request, *args, **kwargs):
""" Passing request to resource obj to control exported fields dynamically """
return {'request': request}
基本上就是这样。立即在继承自 RequestModelResource 的 Resource classes 中的任何位置使用请求。例如:
class MyModelResource(RequestModelResource):
def get_export_fields(self):
fields = super().get_fields()
# Check self.request.user, self.request.GET, etc to impact logic
# however you want!
return fields
导出自定义数据对我来说是这样的:
from django.contrib import admin
from import_export.admin import ExportMixin
from import_export.resources import ModelResource
from jobs.models import Job
class JobResources(ModelResource):
class Meta:
model = Job
fields = ('id', 'foo', 'bar')
class JobAdmin(ExportMixin, admin.ModelAdmin):
resource_class = JobResources
fieldsets = (...)
祝大家好运!
如何从django-import-export中ModelResource的方法queryset获取request.user?
class PeopleResource(ModelResource):
class Meta:
model = People
exclude = ('id','agent', 'public_id', 'active')
def dehydrate_placeA(self, people):
...
...
def get_queryset(self):
query = People.objects.filter( ..... request.user )
return query
问题已解决。我忘记了我之前在我的视图中调用了people_resource.export()
。现在更容易了,因为我只是在方法 export()
中传递了 variabel kwargs,并在模型 PeopleResource
中覆盖了 def export()
。所以我的解决方案就在这里。
views.py
def export_excel(request):
...
people_resource = PeopleResource()
dataset = people_resource.export(agent=request.user.agent,)
...
models.py
class PeopleResource(ModelResource):
class Meta:
model = People
exclude = ('id','agent', 'public_id', 'active')
...
...
def export(self, queryset=None, *args, **kwargs):
queryset = People.objects.filter(agent=kwargs['agent'])
return super(PeopleResource, self).export(queryset, *args, **kwargs)
我正在寻找类似的东西。我希望根据管理员中导出的请求将请求对象附加到 Resource 实例,以便我可以检查它并根据查询参数动态影响功能。如果您想根据用户动态更改它,这也将非常有用。它最终变得非常简单:
首先,subclass ModelResource class 并寻找新的 kwarg:
from import_export import resources
class RequestModelResource(resources.ModelResource):
def __init__(self, *args, **kwargs):
self.request = kwargs.pop('request', None)
super(RequestModelResource, self).__init__(*args, **kwargs)
然后,在 import-export 中有一个相关的管理方法可以用来传递 kwargs。 See here。将此添加到继承自 import_export.admin.ImportExportModelAdmin
:
class MyModelAdmin(ImportExportModelAdmin):
resource_class = MyModelResource
def get_resource_kwargs(self, request, *args, **kwargs):
""" Passing request to resource obj to control exported fields dynamically """
return {'request': request}
基本上就是这样。立即在继承自 RequestModelResource 的 Resource classes 中的任何位置使用请求。例如:
class MyModelResource(RequestModelResource):
def get_export_fields(self):
fields = super().get_fields()
# Check self.request.user, self.request.GET, etc to impact logic
# however you want!
return fields
导出自定义数据对我来说是这样的:
from django.contrib import admin
from import_export.admin import ExportMixin
from import_export.resources import ModelResource
from jobs.models import Job
class JobResources(ModelResource):
class Meta:
model = Job
fields = ('id', 'foo', 'bar')
class JobAdmin(ExportMixin, admin.ModelAdmin):
resource_class = JobResources
fieldsets = (...)
祝大家好运!