diff --git a/django_project/myapp/templates/myapp/events_page.html b/django_project/myapp/templates/myapp/events_page.html
new file mode 100644
index 0000000000000000000000000000000000000000..715f6e0127e2e489d2d57d076a19fbc656aaa8dc
--- /dev/null
+++ b/django_project/myapp/templates/myapp/events_page.html
@@ -0,0 +1,26 @@
+{% extends "base.html" %}
+
+{% block content %}
+<h1>Upcoming Events</h1>
+
+{% if error %}
+  <p style="color:red">{{ error }}</p>
+{% endif %}
+
+{% if events %}
+  <ul>
+    {% for event in events %}
+      <li>
+        <strong>{{ event.title }}</strong><br>
+        <em>{{ event.date }} at {{ event.time }}</em><br>
+        {{ event.location }}<br>
+        {% if event.description %}
+          <p>{{ event.description }}</p>
+        {% endif %}
+      </li>
+    {% endfor %}
+  </ul>
+{% else %}
+  <p>No events found.</p>
+{% endif %}
+{% endblock %}
\ No newline at end of file
diff --git a/django_project/myapp/views/events_views.py b/django_project/myapp/views/events_views.py
new file mode 100644
index 0000000000000000000000000000000000000000..b9a0c2c3311a2dd2e1c60816a74956bfb5305720
--- /dev/null
+++ b/django_project/myapp/views/events_views.py
@@ -0,0 +1,14 @@
+from django.shortcuts import render
+from django.conf import settings
+import rust_crud_api  # Make sure this matches your actual module name
+
+def event_list_view(request):
+    db_url = settings.DATABASE_URL
+    try:
+        events = rust_crud_api.get_all_events(db_url)
+        return render(request, 'myapp/event_list.html', {'events': events})
+    except Exception as e:
+        return render(request, 'myapp/event_list.html', {
+            'error': str(e),
+            'events': []
+        })
\ No newline at end of file
diff --git a/rust_crud_api/src/models/events.rs b/rust_crud_api/src/models/events.rs
index 809c61c3e1714a1c67cbd9ad85fa9638d466e099..635c79882cf450a27e5572b25b8e8fa123078b6a 100644
--- a/rust_crud_api/src/models/events.rs
+++ b/rust_crud_api/src/models/events.rs
@@ -36,4 +36,27 @@ pub fn create_event(
     ).map_err(pg_err)?;
 
     Ok(())
+}
+
+#[pyfunction]
+pub fn get_all_events(db_url: &str) -> PyResult<Vec<PyEvent>> {
+    let mut client = Client::connect(db_url, NoTls).map_err(pg_err)?;
+
+    let mut events = Vec::new();
+    for row in client.query("SELECT * FROM events ORDER BY date, time", &[]).map_err(pg_err)? {
+        let event = PyEvent {
+            id: row.get("id"),
+            title: row.get("title"),
+            description: row.get("description"),
+            location: row.get("location"),
+            date: row.get::<_, chrono::NaiveDate>("date").to_string(),
+            time: row.get::<_, chrono::NaiveTime>("time").to_string(),
+            created_by: row.get("created_by"),
+            group_id: row.get("group_id"),
+            created_at: row.get::<_, chrono::NaiveDateTime>("created_at").to_string(),
+        };
+        events.push(event);
+    }
+
+    Ok(events)
 }
\ No newline at end of file