Как я могу вернуть текстовый файл с точным позиционированием? - PullRequest
2 голосов
/ 10 июня 2011

Я создаю текстовый ответ с помощью Django.Я реализую это обычным способом с помощью файла шаблона.

def create_file(request):
    ... create context ...

    result = render_to_string('template.txt', context_dict)
    response = HttpResponse(result, mimetype='text/plain')
    response['Content-Disposition'] = 'attachment; filename=file.txt'
    return response

Ответ текстового файла уникален тем, что каждый символ в файле должен быть точно расположен.Таким образом, каждый символ в файле, включая пробелы, размещается намеренно.Это представляет проблему для строк с переменными, которые имеют неопределенную длину.Допустим, у нас есть 2 переменные, которые являются строками и находятся в одной строке шаблона.

{{variable1}}   {{variable2}}

И переменная 2 должна появиться в столбце 5 текстового файла.Как я могу указать точную позицию для variable2, если я не знаю, сколько пробелов занимает variable1?Или я просто ошибаюсь?Может быть, проще вообще отказаться от шаблона и создать текстовый ответ полностью в виде?

Ответы [ 3 ]

2 голосов
/ 10 июня 2011

Как вы предложили, я бы сделал это в представлении.

В приведенном вами примере вы можете использовать string.ljust, чтобы выровнять строку влево, дополнив пробелами по мере необходимости..

>>> from string import ljust
>>> variable1 = "v1"
>>> variable2 = "v2"
>>> ljust(variable1, 4)
'v1  '
>>> line = "%s%s" % (ljust(variable1, 4), variable2)
'v1  v2'

В качестве альтернативы, как указали в комментариях Эльф и ΤΖΩΤΖΙΟΥ, вы можете использовать %-formatting

>>> from string import ljust
>>> variable1 = "v1"
>>> variable2 = "v2"
>>> line = "%-4s%s" % (variable1, variable2)
'v1  v2'

Использование .4 для усечения variable1 до 4 символов:

>>> variable1 = "12345"
>>> variable2 = "v2"
>>> line = "%-4s.4%s" % (variable1, variable2)
'v1  v2'
2 голосов
/ 10 июня 2011

(на пути к устареванию) sprintf -подобное % форматирование имеет следующие возможности:

 "%6.6s" % variable # right-justify at most 6 characters prefixing spaces as needed
 "%-6.6s" % variable # left-justify at most 6 characters appending spaces as needed
 "%-*.*s" % (width, width, variable) # left-justify at most width characters

Однако я не знаю, как реализован ваш шаблонный механизм ион может использовать % форматирование.

2 голосов
/ 10 июня 2011

Да, было бы проще создать ответ целиком в представлении. Шаблоны - это просто удобный плагин для рендеринга структурированного текста со статическим каркасом, но мне кажется, что ваша структура находится в макете, а не в каркасе.

Я бы действительно сделал это, создав собственный маленький шаблонизатор для обработки этого особого случая. Существует множество примеров того, как Django делает это, чтобы выложить CSV, PDF и даже изображения, сгенерированные приложениями Django.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...