diff --git a/rest_framework/renderers.py b/rest_framework/renderers.py
index ddfc027e0..e8740d57b 100644
--- a/rest_framework/renderers.py
+++ b/rest_framework/renderers.py
@@ -856,8 +856,8 @@ class DocumentationRenderer(BaseRenderer):
return {
'document': data,
'langs': self.languages,
- 'lang_htmls': ["rest_framework/docs/langs/%s.html" % language for language in self.languages],
- 'lang_intro_htmls': ["rest_framework/docs/langs/%s-intro.html" % language for language in self.languages],
+ 'lang_htmls': [f"rest_framework/docs/langs/{language}.html" for language in self.languages],
+ 'lang_intro_htmls': [f"rest_framework/docs/langs/{language}-intro.html" for language in self.languages],
'code_style': pygments_css(self.code_style),
'request': request
}
diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py
index 10cd79227..48747e687 100644
--- a/rest_framework/serializers.py
+++ b/rest_framework/serializers.py
@@ -1375,7 +1375,7 @@ class ModelSerializer(Serializer):
if not isinstance(read_only_fields, (list, tuple)):
raise TypeError(
'The `read_only_fields` option must be a list or tuple. '
- 'Got %s.' % type(read_only_fields).__name__
+ f'Got {type(read_only_fields).__name__}.'
)
for field_name in read_only_fields:
kwargs = extra_kwargs.get(field_name, {})
diff --git a/rest_framework/templatetags/rest_framework.py b/rest_framework/templatetags/rest_framework.py
index 58f0d45c8..0dbaa196e 100644
--- a/rest_framework/templatetags/rest_framework.py
+++ b/rest_framework/templatetags/rest_framework.py
@@ -194,7 +194,7 @@ def add_class(value, css_class):
return mark_safe(class_re.sub(match.group(1) + " " + css_class,
html))
else:
- return mark_safe(html.replace('>', ' class="%s">' % css_class, 1))
+ return mark_safe(html.replace('>', f' class="{css_class}">', 1))
return value
@@ -202,7 +202,7 @@ def add_class(value, css_class):
def format_value(value):
if getattr(value, 'is_hyperlink', False):
name = str(value.obj)
- return mark_safe('%s' % (value, escape(name)))
+ return mark_safe(f'{escape(name)}')
if value is None or isinstance(value, bool):
return mark_safe('%s
' % {True: 'true', False: 'false', None: 'null'}[value])
elif isinstance(value, list):
@@ -218,8 +218,8 @@ def format_value(value):
return template.render(context)
elif isinstance(value, str):
if (
- (value.startswith('http:') or value.startswith('https:')) and not
- re.search(r'\s', value)
+ (value.startswith('http:') or value.startswith('https:')) and not
+ re.search(r'\s', value)
):
return mark_safe('{value}'.format(value=escape(value)))
elif '@' in value and not re.search(r'\s', value):