diff --git a/src/backend/InvenTree/plugin/samples/integration/templates/uidemo/custom_part_panel.html b/src/backend/InvenTree/plugin/samples/integration/templates/uidemo/custom_part_panel.html
new file mode 100644
index 0000000000..72815ed67e
--- /dev/null
+++ b/src/backend/InvenTree/plugin/samples/integration/templates/uidemo/custom_part_panel.html
@@ -0,0 +1,30 @@
+{% load i18n %}
+
+<h4>Custom Plugin Panel</h4>
+
+<p>
+This content has been rendered by a custom plugin, and will be displayed for any "part" instance
+(as long as the plugin is enabled).
+This content has been rendered on the server, using the django templating system.
+</p>
+
+<h5>Part Details</h5>
+
+<table class='table table-striped table-condensed'>
+    <tr>
+        <th>Part Name</th>
+        <td>{{ part.name }}</td>
+    </tr>
+    <tr>
+        <th>Part Description</th>
+        <td>{{ part.description }}</td>
+    </tr>
+    <tr>
+        <th>Part Category</th>
+        <td>{{ part.category.pathstring }}</td>
+    </tr>
+    <tr>
+        <th>Part IPN</th>
+        <td>{% if part.IPN %}{{ part.IPN }}{% else %}<i>No IPN specified</i>{% endif %}</td>
+    </tr>
+</table>
diff --git a/src/backend/InvenTree/plugin/samples/integration/user_interface_sample.py b/src/backend/InvenTree/plugin/samples/integration/user_interface_sample.py
index 90cadb4265..856a73a474 100644
--- a/src/backend/InvenTree/plugin/samples/integration/user_interface_sample.py
+++ b/src/backend/InvenTree/plugin/samples/integration/user_interface_sample.py
@@ -2,7 +2,9 @@
 
 from django.utils.translation import gettext_lazy as _
 
+from part.models import Part
 from plugin import InvenTreePlugin
+from plugin.helpers import render_template, render_text
 from plugin.mixins import SettingsMixin, UserInterfaceMixin
 
 
@@ -36,19 +38,47 @@ class SampleUserInterfacePlugin(SettingsMixin, UserInterfaceMixin, InvenTreePlug
 
         # First, add a custom panel which will appear on every type of page
         # This panel will contain a simple message
+
+        content = render_text(
+            """
+            This is a <i>sample panel</i> which appears on every page.
+            It renders a simple string of <b>HTML</b> content.
+
+            <br>
+            <h5>Instance Details:</h5>
+            <ul>
+            <li>Instance Type: {{ instance_type }}</li>
+            <li>Instance ID: {{ instance_id }}</li>
+            </ul>
+            """,
+            context={'instance_type': instance_type, 'instance_id': instance_id},
+        )
+
         panels.append({
             'name': 'sample_panel',
             'label': 'Sample Panel',
-            'content': 'This is a <i>sample panel</i> which appears on every page. It renders a simple string of <b>HTML</b> content.',
+            'content': content,
         })
 
         # Next, add a custom panel which will appear on the 'part' page
+        # Note that this content is rendered from a template file,
+        # using the django templating system
         if self.get_setting('ENABLE_PART_PANELS') and instance_type == 'part':
-            panels.append({
-                'name': 'part_panel',
-                'label': 'Part Panel',
-                'content': 'This is a custom panel which appears on the <b>Part</b> view page.',
-            })
+            try:
+                part = Part.objects.get(pk=instance_id)
+            except (Part.DoesNotExist, ValueError):
+                part = None
+
+            if part:
+                content = render_template(
+                    self, 'uidemo/custom_part_panel.html', context={'part': part}
+                )
+
+                panels.append({
+                    'name': 'part_panel',
+                    'label': 'Part Panel',
+                    'content': content,
+                })
 
         # Next, add a custom panel which will appear on the 'purchaseorder' page
         if (