Field support¶
Conjure introspects each model field and picks a list cell and a form control for it automatically. This page is the mapping — the field type → control matrix.
Generated in the future
📋 This matrix will eventually be generated from the
field-renderer registry in code (the same registry @register_field extends), so it can
never drift. Today it's maintained here; the renderer names are the actual composed
components.
Matrix¶
| Django field | List cell | Form control | Notes |
|---|---|---|---|
CharField, TextField |
text | text / textarea | TextField → multiline. |
CharField(choices=…) |
StatusBadge / display |
select | Uses {field}_display. |
IntegerField, FloatField, DecimalField |
number (right-aligned) | number | |
| Money / amount decimals | MoneyCell |
number | Currency-formatted; pair with --gain/--loss for deltas. |
BooleanField |
BoolCell |
toggle / checkbox | |
DateField, DateTimeField |
DateCell |
date / datetime picker | Range filters via __gte/__lte. |
ForeignKey |
EntityLink (+ {fk}_label) |
FkCombobox |
Debounced async search + infinite scroll. |
OneToOneField |
EntityLink |
FkCombobox |
|
| Reverse FK (children) | — | InlineTable |
Declared via inlines; atomic save. |
ImageField, FileField |
ThumbCell |
ImageUploadField |
Multipart upload + XHR progress. |
EmailField, URLField |
text (linkified) | text | |
UUIDField (pk) |
text | read-only | PK routes adapt to string/UUID automatically. |
JSONField |
truncated text | textarea (JSON) | |
| Delta / change columns | DeltaCell |
— | Computed display, finance colors. |
ManyToManyField |
— | — (📋) | Excluded in v1; multiselect on the roadmap. |
How a field becomes a control¶
graph LR
M["model field"] --> S["schema.py introspection"]
S --> J["schema JSON<br/>(type, choices, fk, ...)"]
J --> R["field-renderer registry"]
R --> C["list cell + form control"]
The backend describes the field in the schema JSON; the frontend's renderer registry maps that description to a cell and a control. To support a custom field type, register both sides — see below.
Fields excluded by design¶
| Field | Why | Where it lands |
|---|---|---|
password on User |
Never round-trip a hash | Dropped from schema, responses, and forms. |
ManyToManyField |
No multiselect control in v1 | Roadmap. |
| Computed admin columns | Not real model fields | Frontend custom cell / custom page. |
Adding a field type¶
For a custom field, GFK, or GIS field, register a renderer pair:
backend — describe the field in the schema
from conjure import register_field
@register_field("MyField")
def my_field_schema(field):
return {"type": "myfield", "control": "my-control"}
frontend — render the cell + control
registerFieldRenderer("myfield", {
cell: MyCell,
control: MyControl,
});
See Extension points for the full contract.