Как добавить ссылку в строку f?

#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>'