2011-06-09 124 views
2

我正在用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列。如果我不知道variable1占用了多少空间,我怎样才能为variable2指定一个精确的位置?或者,我只是想说这个完全错误?将模板完全抛弃并在视图中完全创建文本响应可能更容易?

回答

2

如你所说,我会在视图中这样做。

对于您给出的示例,可以使用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' 
+1

右对齐更容易。 (“%06s”%variable1)会在字符串的左边放置6个len空格。 (但是,如果需要,它不会截断为6个字符。) – 2011-06-09 23:46:10

+0

感谢您的回复。使用ljust看起来比模板更有前途。现在我需要考虑一个代码结构来处理我创建的行的每种情况(62确切地说:-() – buken 2011-06-10 00:01:48

+0

无论如何,您必须这样做,否?即使模板做了你想要的,您仍然必须按照严格的细节描述每一行,就像网页以严格的细节描述每个DIV,SPAN和TABLE/TR/TD一样。描述结构,然后编写代码将其合并,然后编写代码使结构可以插入 – 2011-06-10 00:15:25

2

是的,在视图中完全创建响应会更容易。模板只是一个方便的插件,用于使用静态脚手架呈现结构化文本,但听起来像您的结构在布局中,而不是脚手架。

我确实会通过创建自己的小模板引擎来处理这个特殊情况。有很多Django这样做的例子,用于吐出CSV,PDF,甚至是由Django应用程序生成的图像。

2

的(上方式成为过时)sprintf-like %格式化具有以下功能:

"%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 

不过,我不知道你的模板机制是如何实现的,以及是否可以使用%格式。

相关问题