Freemarker无法从列表中获取对象值(Freemarker cannot get object value from the list)
我使用最新的freemarker版本2.3.23我有包含User对象的列表,User对象很简单,只包含name属性。 我的ftl文件显示如下:
<#list userlist> <#items as item> ${item.name} </#items>
我的Java代码如下所示:
public static void main(String[] args) throws Exception { List<User> user = new ArrayList<User>(); User user1 = new User(); User user2 = new User(); user1.setName("jason"); user2.setName("tony"); user.add(user1); user.add(user2); Map<String, Object> params = new HashMap<String, Object>(); params.put("userlist", user); Template template = FreemarkerUtil.getTemplate(FreemarkerUtil.TEMPLATE_PATH, "test.ftl"); FileWriter fw = null; try { fw = new FileWriter(new File(FreemarkerUtil.getProjOutputDomainPath() + "test.txt")); template.process(params, fw); } catch (Exception e) { e.printStackTrace(); } finally { if (fw != null) { fw.close(); } } } class User { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
错误显示如下:
The following has evaluated to null or missing: ==> item.name [in template "test.ftl" at line 3, column 19]`enter code here` Tip: It's the step after the last dot that caused this error, not those before it. Tip: If the failing expression is known to be legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? FTL stack trace ("~" means nesting-related): - Failed at: ${item.name} [in template "test.ftl" at line 3, column 17] Java stack trace (for programmers): freemarker.core.InvalidReferenceException: [... Exception message was already printed; see it above ...] at freemarker.core.InvalidReferenceException.getInstance(InvalidReferenceException.java:131) at freemarker.core.EvalUtil.coerceModelToString(EvalUtil.java:355) at freemarker.core.Expression.evalAndCoerceToString(Expression.java:82) at freemarker.core.DollarVariable.accept(DollarVariable.java:41) at freemarker.core.Environment.visit(Environment.java:324) at freemarker.core.MixedContent.accept(MixedContent.java:54) at freemarker.core.Environment.visitByHiddingParent(Environment.java:345) at freemarker.core.IteratorBlock$IterationContext.executeNestedBlockInner(IteratorBlock.java:268) at freemarker.core.IteratorBlock$IterationContext.executeNestedBlock(IteratorBlock.java:220) at freemarker.core.IteratorBlock$IterationContext.loopForItemsElement(IteratorBlock.java:207) at freemarker.core.Items.accept(Items.java:43) at freemarker.core.Environment.visitByHiddingParent(Environment.java:345) at freemarker.core.IteratorBlock$IterationContext.executeNestedBlockInner(IteratorBlock.java:276) at freemarker.core.IteratorBlock$IterationContext.executeNestedBlock(IteratorBlock.java:220) at freemarker.core.IteratorBlock$IterationContext.accept(IteratorBlock.java:194) at freemarker.core.Environment.visitIteratorBlock(Environment.java:572) at freemarker.core.IteratorBlock.acceptWithResult(IteratorBlock.java:78) at freemarker.core.IteratorBlock.accept(IteratorBlock.java:64) at freemarker.core.Environment.visit(Environment.java:324) at freemarker.core.Environment.process(Environment.java:302) at freemarker.template.Template.process(Template.java:325) at auto.freemarker.template.MySQLGenerator.main(MySQLGenerator.java:61)
I use the latest freemarker version 2.3.23 I have list which contains the User object, User object is simple which only contains the name property. My ftl file show like below:
<#list userlist> <#items as item> ${item.name} </#items>
My Java Code show like below:
public static void main(String[] args) throws Exception { List<User> user = new ArrayList<User>(); User user1 = new User(); User user2 = new User(); user1.setName("jason"); user2.setName("tony"); user.add(user1); user.add(user2); Map<String, Object> params = new HashMap<String, Object>(); params.put("userlist", user); Template template = FreemarkerUtil.getTemplate(FreemarkerUtil.TEMPLATE_PATH, "test.ftl"); FileWriter fw = null; try { fw = new FileWriter(new File(FreemarkerUtil.getProjOutputDomainPath() + "test.txt")); template.process(params, fw); } catch (Exception e) { e.printStackTrace(); } finally { if (fw != null) { fw.close(); } } } class User { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
Error shows below:
The following has evaluated to null or missing: ==> item.name [in template "test.ftl" at line 3, column 19]`enter code here` Tip: It's the step after the last dot that caused this error, not those before it. Tip: If the failing expression is known to be legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? FTL stack trace ("~" means nesting-related): - Failed at: ${item.name} [in template "test.ftl" at line 3, column 17] Java stack trace (for programmers): freemarker.core.InvalidReferenceException: [... Exception message was already printed; see it above ...] at freemarker.core.InvalidReferenceException.getInstance(InvalidReferenceException.java:131) at freemarker.core.EvalUtil.coerceModelToString(EvalUtil.java:355) at freemarker.core.Expression.evalAndCoerceToString(Expression.java:82) at freemarker.core.DollarVariable.accept(DollarVariable.java:41) at freemarker.core.Environment.visit(Environment.java:324) at freemarker.core.MixedContent.accept(MixedContent.java:54) at freemarker.core.Environment.visitByHiddingParent(Environment.java:345) at freemarker.core.IteratorBlock$IterationContext.executeNestedBlockInner(IteratorBlock.java:268) at freemarker.core.IteratorBlock$IterationContext.executeNestedBlock(IteratorBlock.java:220) at freemarker.core.IteratorBlock$IterationContext.loopForItemsElement(IteratorBlock.java:207) at freemarker.core.Items.accept(Items.java:43) at freemarker.core.Environment.visitByHiddingParent(Environment.java:345) at freemarker.core.IteratorBlock$IterationContext.executeNestedBlockInner(IteratorBlock.java:276) at freemarker.core.IteratorBlock$IterationContext.executeNestedBlock(IteratorBlock.java:220) at freemarker.core.IteratorBlock$IterationContext.accept(IteratorBlock.java:194) at freemarker.core.Environment.visitIteratorBlock(Environment.java:572) at freemarker.core.IteratorBlock.acceptWithResult(IteratorBlock.java:78) at freemarker.core.IteratorBlock.accept(IteratorBlock.java:64) at freemarker.core.Environment.visit(Environment.java:324) at freemarker.core.Environment.process(Environment.java:302) at freemarker.template.Template.process(Template.java:325) at auto.freemarker.template.MySQLGenerator.main(MySQLGenerator.java:61)
原文:https://stackoverflow.com/questions/34503918
更新时间:2022-04-21 13:04
最满意答案
I ended using a custom template filter:
@register.filter @stringfilter def datedate(value,format="%d/%m/%Y"): try: return parse_datetime(value).strftime(format) except Exception as e: return ""
So when I did
{{mydate|datedate}}
it shows "22/03/2016"Thank you all for your help.
相关问答
更多-
TCP/IP模型是一个________。[2023-05-19]
a -
下列中不属于面向对象的编程语言的是?[2022-05-30]
a -
时区差异。 该日期是2012年5月1日午夜,所以如果您的服务器落后于GMT,则仅为2012年4月30日。 Time zone difference. The date is midnight on 5/1/2012, so if your server is behind GMT, it's only 4/30/2012.
-
django模板日期格式(django template date formatting)[2023-10-06]
问题中有一些缺失的信息。 post对象来自tastypie API调用,并且它不会将日期/日期时间与django ORM默认情况下的相同。 我最后切换到只使用普通的django ORM,但另一种选择是tastypie日期时间可以使用TASTYPIE_DATETIME_FORMATTING设置修改http://django-tastypie.readthedocs.org/en/latest/serialization.html There was some missing information in th ... -
管理系统使用默认的ModelForm来编辑对象。 您需要提供自定义表单,以便您可以开始覆盖字段行为。 在modelform中 ,使用DateField覆盖该字段,并使用input_formats选项。 MY_DATE_FORMATS = ['%d/%m/%Y',] class MyModelForm(forms.ModelForm): date = forms.DateField(input_formats=MY_DATE_FORMATS) class Meta: mode ...
-
您应该首先使用strftime格式的本地化版本解析它。 from datetime import datetime d = datetime.strptime('...') booking.objects.get(..., booking_date=d.date()) 在strptime使用这些格式: http://linux.die.net/man/3/strftime 您不应该依赖于直接从用户传递到查询中。 看起来您应该从您的具体示例中执行以下操作: d = datetime.strptime('%d ...
-
Java中的本地化日期格式(Localized date format in Java)[2023-08-03]
使用乔达时间( http://joda-time.sourceforge.net/ )是不可能的? 如果没有,那么我会全心全意推荐使用这个美好的库,而不是繁琐的Java API。 如果没有,你可以使用DateFormat.getDateTimeInstance(int, int, Locale) 第一个int是小时的样式,另一个是时间的样式,所以请尝试使用: DateFormat f = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat. ... -
Django本地化模板(Django localized templates)[2022-05-06]
看看这个问题: 如何本地化Django应用程序的内容 我会说,尝试为每种语言维护相同的模板。 但是,如果您必须,或者您认为这是合理的,那么您肯定可以针对某些其他语言使用一组不同的模板。 例如,我知道阿拉伯语是从右到左读的,所以在这种情况下可能有不同的模板。 Take a look at this question: How to localize Content of a Django application I'd say try to maintain the same template for eac ... -
如何在django模板中显示日期时间的本地化时间(How to display localized time from datetime in django template)[2022-11-26]
使用{{ event.next_contact|localtime|date:"H:i" }} 。 如果您设置了USE_TZ=True ,则可以跳过USE_TZ=True过滤器。 从Django 1.7开始传递带有附加时区信息的日期时间值(时区感知日期time实例)时, time过滤器将接受与时区相关的格式说明符'e','O','T'和'Z'。 Use {{ event.next_contact|localtime|date:"H:i" }}. If you have set USE_TZ=True you ... -
如何使用特定格式在Django模板上获取本地化日期?(How to get a localized date on Django template using a specific format?)[2023-01-15]
看来你想要ISO 8601格式的日期。 你可以使用django的日期过滤器和'c'作为参数来渲染它。 {{ mydate|date:"c" }} 详细了解date filter I ended using a custom template filter: @register.filter @stringfilter def datedate(value,format="%d/%m/%Y"): try: return parse_datetime(value).strftime(f ...