#python #django #django-models #django-views #django-templates
Вопрос:
Я пытаюсь добавить ссылку в строку f ниже:
d = f'<li> {event.time} {event.teacher} {event.student} {event.status} </li>'
В принципе, я хочу, чтобы это выглядело примерно так, как показано ниже:
f'<li> <a href="{% url 'somewhere' event.pk %}"> {event.time} {event.teacher} {event.student} {event.status} </a> </li>'
Однако, когда я это делаю, я получаю следующую ошибку:
SyntaxError: f-string: expecting '}'
Вы, ребята, знаете, как ввести ссылку в строку f? Пожалуйста, задавайте мне любые вопросы, которые у вас есть.
Вот контекст кода, в котором у меня есть строка f, как некоторые из вас спрашивали:
class Calendar(HTMLCalendar):
def __init__(self, year=None, month=None):
self.year = year
self.month = month
super(Calendar, self).__init__()
# formats a day as a td
# filter events by day
def formatday(self, day, events):
events_per_day = events.filter(date__day=day)
d = ''
if True:
for event in events_per_day:
d = f'<li> {event.time} {event.teacher} {event.student} {event.status} </li>'
if day != 0:
return f"<td><span class='date'>{day}</span><ul> {d} </ul></td>"
return '<td></td>'
Кстати, все это в моем utils.py папка.
Комментарии:
1. Пожалуйста, дайте более подробную информацию о том, где будет размещена строка f….спасибо. Будет ли это непосредственно в представлении или в объекте сообщения в представлении
2. Спасибо за ваш комментарий. Я добавил контекст для строки f в вопросе.
3. На мой взгляд, код выглядит нормально. Проблема в какой-то другой (случайно искаженной) f-строке в вашем коде? Проверьте номер строки, связанный с сообщением об ошибке.
4. Кстати, вы, вероятно, захотите вернуться
mark_safe( f"<td>...</td>")
, что может решить вашу следующую проблему. То есть при условии, что это безопасно.format_html
обычно предпочтительнее в подобных контекстах.5. Я на самом деле попробовал
<a href='somewhere' event.pk>
вместо того, что было написано в скобках выше, и в нем не было ошибки. Однако ссылка вообще не работает, когда я пытаюсь щелкнуть по ней на веб-странице.
Ответ №1:
F-строка не будет оценивать теги шаблонов Django, она просто видит это как фигурные скобки, но там, где содержимое является бессмысленным выражением.
Вы можете использовать reverse(…)
[Django-doc] для разрешения шаблонов URL-адресов:
from django.urls import reverse
f'<li> <a href="{ reverse("somewhere", args=(event.pk,)) }"> {event.time} {event.teacher} {event.student} {event.status} </a> </li>'
Комментарии:
1. Спасибо за комментарий. Тем не менее, я понимаю
SyntaxError: f-string: unmatched '('
. Ты знаешь, почему?2. @codebuilder: вы недовольны тем, что открыли скобки
args=(
? Я проверил это с помощью данного выражения, и это сработало. Скобки в выражении должны быть сбалансированы.3. @codebuilder: таким образом, вам необходимо закрыть две круглые скобки, одну для одноэлементного кортежа и одну для вызова функции.
Ответ №2:
вы можете использовать переменную для достижения того же результата :-
url_endpoint = reverse("somewhere", args=(event.pk,))
f'<li> <a href="{url_endpoint}"> {event.time} {event.teacher} {event.student} {event.status} </a> </li>'