rustango 0.27.3

Django-shaped batteries-included web framework for Rust: ORM + migrations + auto-admin + multi-tenancy + audit log + auth (sessions, JWT, OAuth2/OIDC, HMAC) + APIs (ViewSet, OpenAPI auto-derive, JSON:API) + jobs (in-mem + Postgres) + email + media (S3 / R2 / B2 / MinIO + presigned uploads + collections + tags) + production middleware (CSRF, CSP, rate-limiting, compression, idempotency, etc.).
Documentation
{% extends "base.html" %}
{% block title %}{{ model.name }} #{{ pk }} — rustango admin{% endblock title %}
{% block body %}
<nav class="breadcrumb" aria-label="breadcrumb">
  <ol>
    <li><a href="/__admin/">{{ admin_title }}</a></li>
    <li><a href="/__admin/{{ model.table }}">{{ model.name }}</a></li>
    <li><strong>#{{ pk }}</strong></li>
  </ol>
</nav>
<h1>{{ model.name }} <small>#{{ pk }}</small></h1>
<dl>
{% for cell in cells %}
  <dt>{{ cell.label }}</dt>
  <dd>{{ cell.value | safe }}</dd>
{% endfor %}
</dl>
{% if read_only %}
<p><em>This table is read-only.</em></p>
{% else %}
<p>
  <a href="/__admin/{{ model.table }}/{{ pk }}/edit">Edit</a> &middot;
  <form method="post" action="/__admin/{{ model.table }}/{{ pk }}/delete" style="display:inline" onsubmit="return confirm('Delete this row?')">
    <button type="submit">Delete</button>
  </form>
</p>
{% endif %}
{% if audit_entries %}
<section class="audit-trail">
  <h2>Audit trail{% if audit_entries | length > 0 %}
    <small style="font-weight: normal; text-transform: none; letter-spacing: 0;"> &middot; <a href="/__audit?entity_table={{ model.table }}&entity_pk={{ pk }}">View full history</a></small>
  {% endif %}</h2>
  {% if audit_entries | length == 0 %}
    <p><em>No audit history for this row.</em></p>
  {% else %}
  <ol>
    {% for e in audit_entries %}
    <li>
      {% if e.action_name %}
        <span class="audit-op audit-op-action">action: {{ e.action_name }}</span>
      {% else %}
        <span class="audit-op audit-op-{{ e.operation }}">{{ e.operation }}</span>
      {% endif %}
      by <strong>{{ e.source }}</strong>
      <small>at {{ e.occurred_at }}</small>
      <pre class="audit-changes">{{ e.changes }}</pre>
    </li>
    {% endfor %}
  </ol>
  {% endif %}
</section>
{% endif %}
{% endblock body %}