Template {{.Args 0}} not working

1. Caddy version (caddy version):


2. How I run Caddy:

caddy run

a. System environment:

Solus OS (latest)

What is going wrong:

So I have the following file:

  {{include "/templates/head.html" "mycoolwebsite"}}


  <meta charset="utf-8">
  <title>{{.Args 0}} | Wow!</title>

What I’m expecting:

When I go to localhost:443/test.html I expect it to show a page, with a window where the title is “mycoolwebsite”

What is happening:

2022/03/03 01:50:14.067	ERROR	http.log.error	template: /company:2:4: executing "/test.html" at <include "/templates/head.html" "mycoolwebsite">: error calling include: template: /templates/head.html:4:11: executing "/templates/head.html" at <.Args>: Args has arguments but cannot be invoked as function	{"request": {"remote_ip": "", "remote_port": "45226", "proto": "HTTP/2.0", "method": "GET", "host": "localhost", "uri": "/test.html", "headers": {"User-Agent": ["curl/7.79.1"], "Accept": ["*/*"]}, "tls": {"resumed": false, "version": 772, "cipher_suite": 4865, "proto": "h2", "server_name": "localhost"}}, "duration": 0.001573409, "status": 500, "err_id": "at68kezth", "err_trace": "templates.(*Templates).executeTemplate (templates.go:347)"}

It is not clear to me what this means:

executing “/templates/head.html” at <.Args>: Args has arguments but cannot be invoked as function

Doing {{index .Args 0}} fixed it.
But then how would I do something like:

{{include "/templates/head.html" .URL.Query.Get "name"}}

1 Like

Yeah, our docs are wrong. .Args is an array, so it needs to be indexed into, not called. Nice job figuring it out! I’ll fix the docs.

I don’t fully understand the next question though?

It’s because {{include "somefile.html"}} takes some optional arguments. So I’d like to pass the name value from the URL, to the included file.
Then I’d like to pass benjamin to the included file, so that I can use index .Args 0 in the included file to get benjamin.

This however does not seem to work:
{{include "/templates/head.html" .URL.Query.Get "name"}}

I pretty much never play with Go templates so I don’t know if this is right, but maybe you need to do this?

{{include "/templates/head.html" (.URL.Query.Get "name")}}

That does not work for some reason. I’m not sure what to do.

2022/03/04 02:19:26.471	ERROR	http.log.error	template: /mywebsite:2:40: executing "/mywebsite" at <.URL.Query.Get>: can't evaluate field URL in type *templates.TemplateContext	{"request": {"remote_ip": "", "remote_port": "33022", "proto": "HTTP/2.0", "method": "GET", "host": "localhost", "uri": "/mywebsite?name=test", "headers": {"User-Agent": ["curl/7.79.1"], "Accept": ["*/*"]}, "tls": {"resumed": false, "version": 772, "cipher_suite": 4865, "proto": "h2", "server_name": "localhost"}}, "duration": 0.00135977, "status": 500, "err_id": "34nhb8ueq", "err_trace": "templates.(*Templates).executeTemplate (templates.go:347)"}

Actually, this in an of itself does not seem to work for me:
<h1>{{.URL.Query.Get "name"}}</h1>

I think you need to do .Req.Url.Query.Get, because the URL is inside the request


Yep that did it. Thank you!

1 Like

This topic was automatically closed after 30 days. New replies are no longer allowed.