Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django中将参数从函数传递到另一个函数_Python_Django_Excel - Fatal编程技术网

Python 在Django中将参数从函数传递到另一个函数

Python 在Django中将参数从函数传递到另一个函数,python,django,excel,Python,Django,Excel,我在views.py中有两个函数,即:create\u excel和section\u landpins 第节\u定位销: def section_landpins(request): if request.method == "GET": get_id = request.user.id pnt = ButuanMaps.objects.get(clandpin='162-03-0001-017-33').geom kmdistance

我在
views.py
中有两个函数,即:
create\u excel
section\u landpins

第节\u定位销

def section_landpins(request):
    if request.method == "GET":
        get_id = request.user.id
        pnt = ButuanMaps.objects.get(clandpin='162-03-0001-017-33').geom
        kmdistance = request.GET.get('kmtocity', default=100)
        mysection = request.GET.get('mysection', default='All')
        getarea = request.GET.get('getarea', default=5500000)
        getvalue = request.GET.get('mysoiltype', default=0)
        getvalue1 = request.GET.get('myerosion', default=0)

        args = []
        kwargs = {
            'landproperty__sownerid__id': get_id,
            'geom__distance_lte': (pnt, D(km=kmdistance)),
            'narea__lte': getarea
        }

        if mysection != 'All':
            kwargs['ssectionid__id'] = mysection

        if getvalue != '0':
            args.append(Q(geom__intersects=SoilType.objects.get(id=getvalue).geom))

        if getvalue1 != '0':
            args.append(Q(geom__intersects=ErosionMap.objects.get(id=getvalue1).geom))

        #this queryset below, I want this to be pass to `create_excel` function
        m = ButuanMaps.objects.filter(*args, **kwargs).values_list('clandpin')
        return HttpResponse(json.dumps(list(m)), content_type='application/json')
我想将变量
m
传递给另一个函数以过滤我的excel文件

以下是
创建excel

def create_excel(request):
    book = xlwt.Workbook(encoding='utf8')
    sheet = book.add_sheet('untitled')

    default_style = xlwt.Style.default_style
    datetime_style = xlwt.easyxf(num_format_str='dd/mm/yyyy hh:mm')
    date_style = xlwt.easyxf(num_format_str='dd/mm/yyyy')

    headers = [f.name for f in SOMEMODELHERE._meta.fields]
    #values should have the query of m from `section_landpins`
    values = LandProperty.objects.all().values_list()
    values_list = [headers] + list(values)

    for row, rowdata in enumerate(values_list):
        for col, val in enumerate(rowdata):
            if isinstance(val, datetime):
                style = datetime_style
            elif isinstance(val, date):
                style = date_style
            else:
                style = default_style
            sheet.write(row, col, val, style=style)

    response = HttpResponse(mimetype='application/vnd.ms-excel')
    response['Content-Disposition'] = 'attachment; filename=example.xls'
    book.save(response)
    return response

如何获取或传递查询集
m
部分\u landpins
创建\u excel
函数,以过滤excel文件结果?

听起来您想在不同请求之间访问变量。有几种方法可以做到这一点:

  • 当用户访问第二个视图时,只需重新计算m。如果您这样做,您应该编写一个单独的函数,这两个视图方法都会调用,以获取m
  • 如果要避免在第二个视图中重新计算m,可以在第一个视图中缓存m的值,并且仅在m过期时重新计算
  • 在会话中存储所需的信息。这是暂时的,因为用户的会话将过期 我想我会选择1。首先,如果您遇到任何性能问题,请切换到2

    下面是一个如何执行1的示例:

    def section_landpins(request):
        queryset = get_landpins_from_request(request)
        return HttpResponse(json.dumps(list(queryset)), content_type='application/json')
    
    def create_excel(request):
        queryset = get_landpins_from_request(request)
        # Do rest of processing here
        return response
    
    def get_landpins_from_request(request):
        "Returns queryset of landpins based on GET request."
        # Add processing of request.GET into a queryset here
        return queryset
    

    您可以根据需要更改代码

    def section_landpins(request):
      if request.method == "GET":
        get_id = request.user.id
        pnt = ButuanMaps.objects.get(clandpin='162-03-0001-017-33').geom
        kmdistance = request.GET.get('kmtocity', default=100)
        mysection = request.GET.get('mysection', default='All')
        getarea = request.GET.get('getarea', default=5500000)
        getvalue = request.GET.get('mysoiltype', default=0)
        getvalue1 = request.GET.get('myerosion', default=0)
    
        args = []
        kwargs = {
            'landproperty__sownerid__id': get_id,
            'geom__distance_lte': (pnt, D(km=kmdistance)),
            'narea__lte': getarea
        }
    
        if mysection != 'All':
            kwargs['ssectionid__id'] = mysection
    
        if getvalue != '0':
            args.append(Q(geom__intersects=SoilType.objects.get(id=getvalue).geom))
    
        if getvalue1 != '0':
            args.append(Q(geom__intersects=ErosionMap.objects.get(id=getvalue1).geom))
    
        #this queryset below, I want this to be pass to `create_excel` function
        request.m = ButuanMaps.objects.filter(*args, **kwargs).values_list('clandpin')
        return create_excel(request)
    
    
    
     def create_excel(request):
        book = xlwt.Workbook(encoding='utf8')
        sheet = book.add_sheet('untitled')
    
        default_style = xlwt.Style.default_style
        datetime_style = xlwt.easyxf(num_format_str='dd/mm/yyyy hh:mm')
        date_style = xlwt.easyxf(num_format_str='dd/mm/yyyy')
    
        headers = [f.name for f in SOMEMODELHERE._meta.fields]
        #the required queryset can be accessed this way
        values = request.m
        values = LandProperty.objects.all().values_list()
        values_list = [headers] + list(values)
    
        for row, rowdata in enumerate(values_list):
           for col, val in enumerate(rowdata):
               if isinstance(val, datetime):
                   style = datetime_style
               elif isinstance(val, date):
                   style = date_style
               else:
                   style = default_style
               sheet.write(row, col, val, style=style)
    
        response = HttpResponse(mimetype='application/vnd.ms-excel')
        response['Content-Disposition'] = 'attachment; filename=example.xls'
        book.save(response)
        return response
    

    我认为这会起作用。

    我使用了
    create\u excel
    函数作为模板中与
    部分\u landpins
    相同页面的链接。啊,好的,所以您希望在不同的请求中使用变量。我将编辑答案。是的,在相同的模板中单独请求,即
    profile.html
    。你能告诉我如何做第一件事吗?因为我使用了
    section\u landpins
    函数进行搜索筛选,并通过JSON将结果传递给模板。尝试使用why-not为m尝试一个全局变量,并在section\u landpins中分配它,然后在create中使用它_excel@Aameer不可以。在像web框架这样的无状态环境中,不能对状态使用全局变量think function section\u landpins将显示错误,因为它必须返回HttpResponse。我认为没有,因为create\u excel也在返回HttpResponse。不,我仍然需要function
    section\u landpins
    中的数据。实际上,它是一个模板中的两个独立请求,我只想从
    部分\u landpins
    函数中获取查询集,以过滤
    创建\u excel
    。这不是实际的httpresponse。您的响应是一个函数对象,它正在调用另一个具有httpresponse的函数。您应该在概念上尝试它,我们似乎正在返回httpresponse,但它显示了错误。请看,我刚刚尝试了类似的代码,它工作正常。它正在按预期返回httpresponse。如果你觉得可以的话,你可以试试。