簡體   English   中英

將參數從函數傳遞給Django中的另一個函數

[英]Passing parameter from function to another function in Django

我在views.py有這兩個函數: create_excelsection_landpins

section_landpins

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文件。

這是create_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

我如何從section_landpins獲取或傳遞queryset mcreate_excel函數,以便我過濾Excel文件結果?

聽起來您想訪問不同請求之間的變量。 有幾種方法可以做到這一點:

  1. 用戶訪問第二個視圖時只需重新計算m。 如果這樣做,則應編寫一個單獨的函數,兩個視圖方法都將調用該函數以獲取m。
  2. 如果要避免在第二個視圖中重新計算m,則可以在第一個視圖中緩存m的值,並且僅在過期時重新計算它。 https://docs.djangoproject.com/en/dev/topics/cache/
  3. 存儲會話所需的信息。 這是無常的,因為用戶的會話將過期。 https://docs.djangoproject.com/en/dev/topics/http/sessions/

我想我會先從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

我認為這會起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM