We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
2.0: Tag string representation is incorrect
### Environment
* Nautobot version (Docker tag too if applicable): `next`, e13883b7b8a4f44bca0c40d8074dcf8f82e544e6

### Steps to Reproduce
1. Create a Tag and associate it to any model
2. View the legacy-UI list view or detail view of that model

<!-- What did you expect to happen? -->
### Expected Behavior

Tag name to be displayed

<!-- What happened instead? -->
### Observed Behavior

`Tag object (<uuid>)` is displayed.

![image](https://github.com/nautobot/nautobot/assets/5603551/1da33bf8-f9ee-4fb7-b4cb-4f2c2d682496)

Appears to be a regression due to #3914.


--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `nautobot/extras/models/tags.py`
Content:
```
1 from django.contrib.contenttypes.models import ContentType
2 from django.db import models
3 from taggit.models import GenericUUIDTaggedItemBase
4 
5 from nautobot.core.choices import ColorChoices
6 from nautobot.core.models import BaseManager, BaseModel
7 from nautobot.core.models.fields import ColorField
8 from nautobot.core.models.querysets import RestrictedQuerySet
9 from nautobot.extras.models import ChangeLoggedModel, CustomFieldModel
10 from nautobot.extras.models.mixins import NotesMixin
11 from nautobot.extras.models.relationships import RelationshipModel
12 from nautobot.extras.utils import extras_features, TaggableClassesQuery
13 
14 
15 #
16 # Tags
17 #
18 
19 
20 class TagQuerySet(RestrictedQuerySet):
21     """Queryset for `Tags` objects."""
22 
23     def get_for_model(self, model):
24         """
25         Return all `Tags` assigned to the given model.
26         """
27         return self.filter(content_types__model=model._meta.model_name, content_types__app_label=model._meta.app_label)
28 
29 
30 # Tag *should* be a `NameColorContentTypesModel` but that way lies circular import purgatory. Sigh.
31 @extras_features(
32     "custom_validators",
33 )
34 class Tag(BaseModel, ChangeLoggedModel, CustomFieldModel, RelationshipModel, NotesMixin):
35     name = models.CharField(max_length=100, unique=True)
36     content_types = models.ManyToManyField(
37         to=ContentType,
38         related_name="tags",
39         limit_choices_to=TaggableClassesQuery(),
40     )
41     color = ColorField(default=ColorChoices.COLOR_GREY)
42     description = models.CharField(
43         max_length=200,
44         blank=True,
45     )
46 
47     objects = BaseManager.from_queryset(TagQuerySet)()
48 
49     class Meta:
50         ordering = ["name"]
51 
52     def validate_content_types_removal(self, content_types_id):
53         """Validate content_types to be removed are not tagged to a model"""
54         errors = {}
55 
56         removed_content_types = self.content_types.exclude(id__in=content_types_id)
57 
58         # check if tag is assigned to any of the removed content_types
59         for content_type in removed_content_types:
60             model = content_type.model_class()
61             if model.objects.filter(tags=self).exists():
62                 errors.setdefault("content_types", []).append(
63                     f"Unable to remove {model._meta.label_lower}. Dependent objects were found."
64                 )
65 
66         return errors
67 
68 
69 class TaggedItem(BaseModel, GenericUUIDTaggedItemBase):
70     tag = models.ForeignKey(to=Tag, related_name="%(app_label)s_%(class)s_items", on_delete=models.CASCADE)
71 
72     class Meta:
73         index_together = ("content_type", "object_id")
74         unique_together = [["content_type", "object_id", "tag"]]
75
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/nautobot/extras/models/tags.py b/nautobot/extras/models/tags.py
--- a/nautobot/extras/models/tags.py
+++ b/nautobot/extras/models/tags.py
@@ -46,6 +46,9 @@
 
     objects = BaseManager.from_queryset(TagQuerySet)()
 
+    def __str__(self):
+        return self.name
+
     class Meta:
         ordering = ["name"]

{"golden_diff": "diff --git a/nautobot/extras/models/tags.py b/nautobot/extras/models/tags.py\n--- a/nautobot/extras/models/tags.py\n+++ b/nautobot/extras/models/tags.py\n@@ -46,6 +46,9 @@\n \n     objects = BaseManager.from_queryset(TagQuerySet)()\n \n+    def __str__(self):\n+        return self.name\n+\n     class Meta:\n         ordering = [\"name\"]\n", "issue": "2.0: Tag string representation is incorrect\n### Environment\r\n* Nautobot version (Docker tag too if applicable): `next`, e13883b7b8a4f44bca0c40d8074dcf8f82e544e6\r\n\r\n### Steps to Reproduce\r\n1. Create a Tag and associate it to any model\r\n2. View the legacy-UI list view or detail view of that model\r\n\r\n<!-- What did you expect to happen? -->\r\n### Expected Behavior\r\n\r\nTag name to be displayed\r\n\r\n<!-- What happened instead? -->\r\n### Observed Behavior\r\n\r\n`Tag object (<uuid>)` is displayed.\r\n\r\n![image](https://github.com/nautobot/nautobot/assets/5603551/1da33bf8-f9ee-4fb7-b4cb-4f2c2d682496)\r\n\r\nAppears to be a regression due to #3914.\r\n\n", "before_files": [{"content": "from django.contrib.contenttypes.models import ContentType\nfrom django.db import models\nfrom taggit.models import GenericUUIDTaggedItemBase\n\nfrom nautobot.core.choices import ColorChoices\nfrom nautobot.core.models import BaseManager, BaseModel\nfrom nautobot.core.models.fields import ColorField\nfrom nautobot.core.models.querysets import RestrictedQuerySet\nfrom nautobot.extras.models import ChangeLoggedModel, CustomFieldModel\nfrom nautobot.extras.models.mixins import NotesMixin\nfrom nautobot.extras.models.relationships import RelationshipModel\nfrom nautobot.extras.utils import extras_features, TaggableClassesQuery\n\n\n#\n# Tags\n#\n\n\nclass TagQuerySet(RestrictedQuerySet):\n    \"\"\"Queryset for `Tags` objects.\"\"\"\n\n    def get_for_model(self, model):\n        \"\"\"\n        Return all `Tags` assigned to the given model.\n        \"\"\"\n        return self.filter(content_types__model=model._meta.model_name, content_types__app_label=model._meta.app_label)\n\n\n# Tag *should* be a `NameColorContentTypesModel` but that way lies circular import purgatory. Sigh.\n@extras_features(\n    \"custom_validators\",\n)\nclass Tag(BaseModel, ChangeLoggedModel, CustomFieldModel, RelationshipModel, NotesMixin):\n    name = models.CharField(max_length=100, unique=True)\n    content_types = models.ManyToManyField(\n        to=ContentType,\n        related_name=\"tags\",\n        limit_choices_to=TaggableClassesQuery(),\n    )\n    color = ColorField(default=ColorChoices.COLOR_GREY)\n    description = models.CharField(\n        max_length=200,\n        blank=True,\n    )\n\n    objects = BaseManager.from_queryset(TagQuerySet)()\n\n    class Meta:\n        ordering = [\"name\"]\n\n    def validate_content_types_removal(self, content_types_id):\n        \"\"\"Validate content_types to be removed are not tagged to a model\"\"\"\n        errors = {}\n\n        removed_content_types = self.content_types.exclude(id__in=content_types_id)\n\n        # check if tag is assigned to any of the removed content_types\n        for content_type in removed_content_types:\n            model = content_type.model_class()\n            if model.objects.filter(tags=self).exists():\n                errors.setdefault(\"content_types\", []).append(\n                    f\"Unable to remove {model._meta.label_lower}. Dependent objects were found.\"\n                )\n\n        return errors\n\n\nclass TaggedItem(BaseModel, GenericUUIDTaggedItemBase):\n    tag = models.ForeignKey(to=Tag, related_name=\"%(app_label)s_%(class)s_items\", on_delete=models.CASCADE)\n\n    class Meta:\n        index_together = (\"content_type\", \"object_id\")\n        unique_together = [[\"content_type\", \"object_id\", \"tag\"]]\n", "path": "nautobot/extras/models/tags.py"}], "after_files": [{"content": "from django.contrib.contenttypes.models import ContentType\nfrom django.db import models\nfrom taggit.models import GenericUUIDTaggedItemBase\n\nfrom nautobot.core.choices import ColorChoices\nfrom nautobot.core.models import BaseManager, BaseModel\nfrom nautobot.core.models.fields import ColorField\nfrom nautobot.core.models.querysets import RestrictedQuerySet\nfrom nautobot.extras.models import ChangeLoggedModel, CustomFieldModel\nfrom nautobot.extras.models.mixins import NotesMixin\nfrom nautobot.extras.models.relationships import RelationshipModel\nfrom nautobot.extras.utils import extras_features, TaggableClassesQuery\n\n\n#\n# Tags\n#\n\n\nclass TagQuerySet(RestrictedQuerySet):\n    \"\"\"Queryset for `Tags` objects.\"\"\"\n\n    def get_for_model(self, model):\n        \"\"\"\n        Return all `Tags` assigned to the given model.\n        \"\"\"\n        return self.filter(content_types__model=model._meta.model_name, content_types__app_label=model._meta.app_label)\n\n\n# Tag *should* be a `NameColorContentTypesModel` but that way lies circular import purgatory. Sigh.\n@extras_features(\n    \"custom_validators\",\n)\nclass Tag(BaseModel, ChangeLoggedModel, CustomFieldModel, RelationshipModel, NotesMixin):\n    name = models.CharField(max_length=100, unique=True)\n    content_types = models.ManyToManyField(\n        to=ContentType,\n        related_name=\"tags\",\n        limit_choices_to=TaggableClassesQuery(),\n    )\n    color = ColorField(default=ColorChoices.COLOR_GREY)\n    description = models.CharField(\n        max_length=200,\n        blank=True,\n    )\n\n    objects = BaseManager.from_queryset(TagQuerySet)()\n\n    def __str__(self):\n        return self.name\n\n    class Meta:\n        ordering = [\"name\"]\n\n    def validate_content_types_removal(self, content_types_id):\n        \"\"\"Validate content_types to be removed are not tagged to a model\"\"\"\n        errors = {}\n\n        removed_content_types = self.content_types.exclude(id__in=content_types_id)\n\n        # check if tag is assigned to any of the removed content_types\n        for content_type in removed_content_types:\n            model = content_type.model_class()\n            if model.objects.filter(tags=self).exists():\n                errors.setdefault(\"content_types\", []).append(\n                    f\"Unable to remove {model._meta.label_lower}. Dependent objects were found.\"\n                )\n\n        return errors\n\n\nclass TaggedItem(BaseModel, GenericUUIDTaggedItemBase):\n    tag = models.ForeignKey(to=Tag, related_name=\"%(app_label)s_%(class)s_items\", on_delete=models.CASCADE)\n\n    class Meta:\n        index_together = (\"content_type\", \"object_id\")\n        unique_together = [[\"content_type\", \"object_id\", \"tag\"]]\n", "path": "nautobot/extras/models/tags.py"}]}