or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

admin.mdauth.mdcontrib.mddatabase-orm.mdforms.mdhttp.mdindex.mdmigrations.mdmypy-plugin.mdsignals.mdtemplates.mdtransactions.mdurls.mdviews.md

admin.mddocs/

0

# Administration Interface

1

2

Django's admin interface provides automatic administrative interface generation for Django models, including customizable model admin classes, inline editing, actions, and permissions integration.

3

4

## Capabilities

5

6

### Admin Site

7

8

Core admin site classes for managing the administrative interface.

9

10

```python { .api }

11

class AdminSite:

12

"""

13

Administrative interface site manager.

14

15

Central registry for models and admin configuration with authentication.

16

"""

17

name: str = 'admin'

18

app_name: str = 'admin'

19

20

def __init__(self, name: str = 'admin'): ...

21

22

def register(self, model_or_iterable, admin_class=None, **options) -> None: ...

23

def unregister(self, model_or_iterable) -> None: ...

24

def is_registered(self, model) -> bool: ...

25

def add_action(self, action, name: str = None) -> None: ...

26

def disable_action(self, name: str) -> None: ...

27

def get_action(self, name: str): ...

28

def has_permission(self, request: HttpRequest) -> bool: ...

29

def admin_view(self, view, cacheable: bool = False): ...

30

def get_urls(self) -> list: ...

31

def get_app_list(self, request: HttpRequest) -> list: ...

32

def index(self, request: HttpRequest, extra_context: dict = None) -> HttpResponse: ...

33

def app_index(self, request: HttpRequest, app_label: str, extra_context: dict = None) -> HttpResponse: ...

34

def i18n_javascript(self, request: HttpRequest) -> HttpResponse: ...

35

def logout(self, request: HttpRequest, extra_context: dict = None) -> HttpResponse: ...

36

def login(self, request: HttpRequest, extra_context: dict = None) -> HttpResponse: ...

37

def password_change(self, request: HttpRequest, extra_context: dict = None) -> HttpResponse: ...

38

def password_change_done(self, request: HttpRequest, extra_context: dict = None) -> HttpResponse: ...

39

def each_context(self, request: HttpRequest) -> dict: ...

40

41

site_header: str

42

site_title: str

43

site_url: str

44

index_title: str

45

index_template: str

46

app_index_template: str

47

login_template: str

48

login_form: str

49

logout_template: str

50

password_change_template: str

51

password_change_done_template: str

52

53

site: AdminSite # Default admin site instance

54

55

def autodiscover() -> None:

56

"""

57

Automatically discover admin.py modules in installed apps.

58

59

Imports admin modules to trigger model registration.

60

"""

61

```

62

63

### Model Admin

64

65

Base classes for customizing model administration interfaces.

66

67

```python { .api }

68

class BaseModelAdmin:

69

"""

70

Base functionality for model admin classes.

71

72

Provides common admin features without ModelAdmin inheritance.

73

"""

74

autocomplete_fields: tuple = ()

75

raw_id_fields: tuple = ()

76

fields = None

77

exclude = None

78

fieldsets = None

79

filter_horizontal: tuple = ()

80

filter_vertical: tuple = ()

81

radio_fields: dict = {}

82

prepopulated_fields: dict = {}

83

formfield_overrides: dict = {}

84

readonly_fields: tuple = ()

85

ordering = None

86

sortable_by = None

87

view_on_site: bool = True

88

show_full_result_count: bool = True

89

90

def check(self, **kwargs) -> list: ...

91

def formfield_for_dbfield(self, db_field, request: HttpRequest, **kwargs): ...

92

def formfield_for_choice_field(self, db_field, request: HttpRequest, **kwargs): ...

93

def formfield_for_foreignkey(self, db_field, request: HttpRequest, **kwargs): ...

94

def formfield_for_manytomany(self, db_field, request: HttpRequest, **kwargs): ...

95

def get_field_queryset(self, db, db_field, request: HttpRequest): ...

96

def get_changelist(self, request: HttpRequest): ...

97

def get_changelist_form(self, request: HttpRequest, **kwargs): ...

98

def get_changelist_formset(self, request: HttpRequest, **kwargs): ...

99

def lookup_allowed(self, lookup: str, value: str) -> bool: ...

100

def to_field_allowed(self, request: HttpRequest, to_field: str) -> bool: ...

101

def get_readonly_fields(self, request: HttpRequest, obj=None) -> tuple: ...

102

def get_prepopulated_fields(self, request: HttpRequest, obj=None) -> dict: ...

103

def get_queryset(self, request: HttpRequest): ...

104

def message_user(self, request: HttpRequest, message: str, level: int = None, extra_tags: str = '', fail_silently: bool = False) -> None: ...

105

def get_paginator(self, request: HttpRequest, queryset, per_page: int, orphans: int = 0, allow_empty_first_page: bool = True): ...

106

def get_object(self, request: HttpRequest, object_id: str, from_field=None): ...

107

def get_form(self, request: HttpRequest, obj=None, change: bool = False, **kwargs): ...

108

def get_formsets_with_inlines(self, request: HttpRequest, obj=None): ...

109

def get_formsets(self, request: HttpRequest, obj=None): ...

110

def get_inline_instances(self, request: HttpRequest, obj=None) -> list: ...

111

112

class ModelAdmin(BaseModelAdmin):

113

"""

114

Model administration interface configuration.

115

116

Main class for customizing model admin behavior and display.

117

"""

118

list_display: tuple = ('__str__',)

119

list_display_links = None

120

list_filter: tuple = ()

121

list_select_related: bool = False

122

list_per_page: int = 100

123

list_max_show_all: int = 200

124

list_editable: tuple = ()

125

search_fields: tuple = ()

126

search_help_text: str = None

127

date_hierarchy: str = None

128

save_as: bool = False

129

save_as_continue: bool = True

130

save_on_top: bool = False

131

paginator = None

132

preserve_filters: bool = True

133

inlines: list = []

134

add_form_template: str = None

135

change_form_template: str = None

136

change_list_template: str = None

137

delete_confirmation_template: str = None

138

delete_selected_confirmation_template: str = None

139

object_history_template: str = None

140

popup_response_template: str = None

141

142

def get_urls(self) -> list: ...

143

def get_model_perms(self, request: HttpRequest) -> dict: ...

144

def has_view_permission(self, request: HttpRequest, obj=None) -> bool: ...

145

def has_add_permission(self, request: HttpRequest) -> bool: ...

146

def has_change_permission(self, request: HttpRequest, obj=None) -> bool: ...

147

def has_delete_permission(self, request: HttpRequest, obj=None) -> bool: ...

148

def has_module_permission(self, request: HttpRequest) -> bool: ...

149

def get_queryset(self, request: HttpRequest): ...

150

def get_search_results(self, request: HttpRequest, queryset, search_term: str) -> tuple: ...

151

def get_preserved_filters(self, request: HttpRequest) -> str: ...

152

def construct_change_message(self, request: HttpRequest, form, formsets: list, add: bool = False) -> list: ...

153

def message_user(self, request: HttpRequest, message: str, level: int = None, extra_tags: str = '', fail_silently: bool = False) -> None: ...

154

def save_model(self, request: HttpRequest, obj, form, change: bool) -> None: ...

155

def delete_model(self, request: HttpRequest, obj) -> None: ...

156

def save_related(self, request: HttpRequest, form, formsets: list, change: bool) -> None: ...

157

def save_formset(self, request: HttpRequest, form, formset, change: bool) -> None: ...

158

def get_ordering(self, request: HttpRequest) -> list: ...

159

def get_search_fields(self, request: HttpRequest) -> tuple: ...

160

def get_sortable_by(self, request: HttpRequest) -> tuple: ...

161

def get_inline_instances(self, request: HttpRequest, obj=None) -> list: ...

162

def get_inlines(self, request: HttpRequest, obj) -> list: ...

163

def add_view(self, request: HttpRequest, form_url: str = '', extra_context: dict = None) -> HttpResponse: ...

164

def change_view(self, request: HttpRequest, object_id: str, form_url: str = '', extra_context: dict = None) -> HttpResponse: ...

165

def changelist_view(self, request: HttpRequest, extra_context: dict = None) -> HttpResponse: ...

166

def delete_view(self, request: HttpRequest, object_id: str, extra_context: dict = None) -> HttpResponse: ...

167

def history_view(self, request: HttpRequest, object_id: str, extra_context: dict = None) -> HttpResponse: ...

168

def response_add(self, request: HttpRequest, obj, post_url_continue: str = None) -> HttpResponse: ...

169

def response_change(self, request: HttpRequest, obj) -> HttpResponse: ...

170

def response_delete(self, request: HttpRequest, obj_display: str, obj_id: str) -> HttpResponse: ...

171

def get_changeform_initial_data(self, request: HttpRequest) -> dict: ...

172

def get_deleted_objects(self, objs: list, request: HttpRequest) -> tuple: ...

173

```

174

175

### Inline Admin

176

177

Classes for editing related objects inline within parent object forms.

178

179

```python { .api }

180

class InlineModelAdmin(BaseModelAdmin):

181

"""

182

Base class for inline model administration.

183

184

Provides functionality for editing related objects within parent forms.

185

"""

186

model = None

187

fk_name: str = None

188

formset = None

189

form = None

190

extra: int = 3

191

min_num: int = None

192

max_num: int = None

193

template: str = None

194

verbose_name: str = None

195

verbose_name_plural: str = None

196

can_delete: bool = True

197

show_change_link: bool = False

198

classes: list = None

199

200

def get_formset(self, request: HttpRequest, obj=None, **kwargs): ...

201

def get_queryset(self, request: HttpRequest): ...

202

def get_extra(self, request: HttpRequest, obj=None, **kwargs) -> int: ...

203

def get_min_num(self, request: HttpRequest, obj=None, **kwargs) -> int: ...

204

def get_max_num(self, request: HttpRequest, obj=None, **kwargs) -> int: ...

205

def has_add_permission(self, request: HttpRequest, obj=None) -> bool: ...

206

def has_change_permission(self, request: HttpRequest, obj=None) -> bool: ...

207

def has_delete_permission(self, request: HttpRequest, obj=None) -> bool: ...

208

def has_view_permission(self, request: HttpRequest, obj=None) -> bool: ...

209

210

class StackedInline(InlineModelAdmin):

211

"""

212

Inline admin with stacked layout.

213

214

Displays each related object in a separate fieldset block.

215

"""

216

template: str = 'admin/edit_inline/stacked.html'

217

218

class TabularInline(InlineModelAdmin):

219

"""

220

Inline admin with tabular layout.

221

222

Displays related objects in a compact table format.

223

"""

224

template: str = 'admin/edit_inline/tabular.html'

225

226

class GenericInlineModelAdmin(InlineModelAdmin):

227

"""

228

Inline admin for generic foreign key relationships.

229

"""

230

ct_field: str = 'content_type'

231

ct_fk_field: str = 'object_id'

232

formset = None

233

234

def get_formset(self, request: HttpRequest, obj=None, **kwargs): ...

235

236

class GenericStackedInline(GenericInlineModelAdmin):

237

"""

238

Generic inline with stacked layout.

239

"""

240

template: str = 'admin/edit_inline/stacked.html'

241

242

class GenericTabularInline(GenericInlineModelAdmin):

243

"""

244

Generic inline with tabular layout.

245

"""

246

template: str = 'admin/edit_inline/tabular.html'

247

```

248

249

### Admin Actions

250

251

System for defining bulk actions on admin change lists.

252

253

```python { .api }

254

def action(function=None, *, permissions: list = None, description: str = None):

255

"""

256

Decorator for creating admin actions.

257

258

Args:

259

function: Action function to decorate

260

permissions: Required permissions for action

261

description: Human-readable action description

262

263

Returns:

264

Decorated action function

265

"""

266

267

def delete_selected(modeladmin, request: HttpRequest, queryset) -> HttpResponse:

268

"""

269

Built-in action for deleting selected objects.

270

271

Args:

272

modeladmin: ModelAdmin instance

273

request: HTTP request object

274

queryset: Selected objects queryset

275

276

Returns:

277

Confirmation page or redirect after deletion

278

"""

279

delete_selected.short_description = "Delete selected %(verbose_name_plural)s"

280

```

281

282

### Admin Display Decorators

283

284

Decorators for customizing field display in admin interface.

285

286

```python { .api }

287

def display(function=None, *, boolean: bool = None, ordering: str = None, description: str = None, empty_value: str = None):

288

"""

289

Decorator for configuring admin field display.

290

291

Args:

292

function: Method to decorate

293

boolean: Whether field represents boolean value

294

ordering: Database field for sorting

295

description: Column header text

296

empty_value: Display value for empty fields

297

298

Returns:

299

Decorated display method

300

"""

301

```

302

303

### Registration Functions

304

305

Functions for registering models with admin site.

306

307

```python { .api }

308

def register(*models, site: AdminSite = None):

309

"""

310

Decorator for registering models with admin site.

311

312

Args:

313

*models: Model classes to register

314

site: Admin site instance (defaults to default site)

315

316

Returns:

317

Decorator function or admin class

318

"""

319

```

320

321

### Admin Forms

322

323

Specialized forms for admin interface with enhanced widgets.

324

325

```python { .api }

326

class AdminForm:

327

"""

328

Wrapper for forms used in admin interface.

329

330

Provides fieldset organization and admin-specific rendering.

331

"""

332

def __init__(self, form, fieldsets: list, prepopulated_fields: dict, readonly_fields: list = None, model_admin=None): ...

333

334

def __iter__(self): ...

335

def __getitem__(self, name: str): ...

336

def errors(self): ...

337

def non_field_errors(self): ...

338

def media(self): ...

339

340

form: Form

341

fieldsets: list

342

prepopulated_fields: dict

343

model_admin: ModelAdmin

344

345

class AdminErrorList(list):

346

"""

347

Error list with admin-specific formatting.

348

"""

349

def __init__(self, form, errors: list): ...

350

def as_ul(self) -> str: ...

351

def as_text(self) -> str: ...

352

353

class AdminReadonlyField:

354

"""

355

Display-only field for admin forms.

356

"""

357

def __init__(self, form, field: str, is_first: bool, model_admin=None): ...

358

def label_tag(self) -> str: ...

359

def contents(self) -> str: ...

360

361

class Fieldset:

362

"""

363

Fieldset grouping for admin forms.

364

"""

365

def __init__(self, form, name: str = None, readonly_fields: tuple = (), fields: tuple = (), classes: tuple = (), description: str = None, model_admin=None): ...

366

367

def __iter__(self): ...

368

def media(self): ...

369

370

name: str

371

fields: tuple

372

classes: str

373

description: str

374

```

375

376

### Admin Widgets

377

378

Enhanced widgets for admin interface forms.

379

380

```python { .api }

381

class AdminDateWidget(DateInput):

382

"""

383

Date input widget with admin calendar popup.

384

"""

385

template_name: str = 'admin/widgets/date.html'

386

387

class AdminTimeWidget(TimeInput):

388

"""

389

Time input widget with admin time picker.

390

"""

391

template_name: str = 'admin/widgets/time.html'

392

393

class AdminSplitDateTime(SplitDateTimeWidget):

394

"""

395

Split date/time widget for admin interface.

396

"""

397

template_name: str = 'admin/widgets/split_datetime.html'

398

399

class AdminRadioSelect(RadioSelect):

400

"""

401

Radio button widget for admin forms.

402

"""

403

template_name: str = 'admin/widgets/radio.html'

404

405

class AdminFileWidget(ClearableFileInput):

406

"""

407

File upload widget with admin styling.

408

"""

409

template_name: str = 'admin/widgets/clearable_file_input.html'

410

411

class ForeignKeyRawIdWidget(TextInput):

412

"""

413

Raw ID widget for foreign key fields.

414

415

Displays foreign key as text input with lookup popup.

416

"""

417

template_name: str = 'admin/widgets/foreign_key_raw_id.html'

418

419

def __init__(self, rel, admin_site: AdminSite, attrs: dict = None, using: str = None): ...

420

421

def url_parameters(self) -> dict: ...

422

def label_and_url_for_value(self, value) -> tuple: ...

423

424

class ManyToManyRawIdWidget(ForeignKeyRawIdWidget):

425

"""

426

Raw ID widget for many-to-many fields.

427

428

Displays many-to-many as text input with lookup popup.

429

"""

430

template_name: str = 'admin/widgets/many_to_many_raw_id.html'

431

432

class RelatedFieldWidgetWrapper(Widget):

433

"""

434

Wrapper widget that adds related field links.

435

436

Adds change/add/delete links for foreign key widgets.

437

"""

438

template_name: str = 'admin/widgets/related_widget_wrapper.html'

439

440

def __init__(self, widget: Widget, rel, admin_site: AdminSite, can_add_related: bool = None,

441

can_change_related: bool = None, can_delete_related: bool = None, can_view_related: bool = None): ...

442

443

class AutocompleteSelect(Select):

444

"""

445

Select widget with autocomplete functionality.

446

"""

447

template_name: str = 'admin/widgets/autocomplete_select.html'

448

449

def __init__(self, rel, admin_site: AdminSite, attrs: dict = None, choices: tuple = (), using: str = None): ...

450

451

class AutocompleteSelectMultiple(SelectMultiple):

452

"""

453

Multiple select widget with autocomplete functionality.

454

"""

455

template_name: str = 'admin/widgets/autocomplete_select.html'

456

457

def __init__(self, rel, admin_site: AdminSite, attrs: dict = None, choices: tuple = (), using: str = None): ...

458

```

459

460

### Admin Filters

461

462

Filter classes for admin change list sidebar filtering.

463

464

```python { .api }

465

class SimpleListFilter:

466

"""

467

Base class for simple list filters.

468

469

Provides dropdown filtering in admin change list sidebar.

470

"""

471

title: str = None

472

parameter_name: str = None

473

template: str = 'admin/filter.html'

474

475

def __init__(self, request: HttpRequest, params: dict, model, model_admin): ...

476

def has_output(self) -> bool: ...

477

def choices(self, changelist): ...

478

def queryset(self, request: HttpRequest, queryset): ...

479

def expected_parameters(self) -> list: ...

480

def used_parameters(self) -> dict: ...

481

def lookups(self, request: HttpRequest, model_admin): ...

482

483

class BooleanFieldListFilter(SimpleListFilter):

484

"""

485

Filter for boolean fields with Yes/No/All options.

486

"""

487

488

class ChoicesFieldListFilter(SimpleListFilter):

489

"""

490

Filter for fields with choices using choice values.

491

"""

492

493

class DateFieldListFilter(SimpleListFilter):

494

"""

495

Filter for date fields with preset time ranges.

496

"""

497

498

class AllValuesFieldListFilter(SimpleListFilter):

499

"""

500

Filter showing all distinct values for a field.

501

"""

502

503

class RelatedFieldListFilter(SimpleListFilter):

504

"""

505

Filter for foreign key relationships.

506

"""

507

508

class RelatedOnlyFieldListFilter(RelatedFieldListFilter):

509

"""

510

Filter for foreign keys showing only related objects.

511

"""

512

513

class EmptyFieldListFilter(SimpleListFilter):

514

"""

515

Filter for empty/non-empty field values.

516

"""

517

```

518

519

### Admin Utilities

520

521

Utility functions and helpers for admin functionality.

522

523

```python { .api }

524

def display_for_field(value, field, empty_value_display: str) -> str:

525

"""

526

Format field value for admin display.

527

528

Args:

529

value: Field value to format

530

field: Model field instance

531

empty_value_display: Text for empty values

532

533

Returns:

534

Formatted display string

535

"""

536

537

def display_for_value(value, empty_value_display: str, boolean: bool = False) -> str:

538

"""

539

Format raw value for admin display.

540

541

Args:

542

value: Value to format

543

empty_value_display: Text for empty values

544

boolean: Whether to format as boolean

545

546

Returns:

547

Formatted display string

548

"""

549

550

def label_for_field(name: str, model, model_admin=None, return_attr: bool = False) -> str:

551

"""

552

Get display label for model field or attribute.

553

554

Args:

555

name: Field or attribute name

556

model: Model class

557

model_admin: ModelAdmin instance

558

return_attr: Whether to return attribute info

559

560

Returns:

561

Field label string

562

"""

563

564

def help_text_for_field(name: str, model) -> str:

565

"""

566

Get help text for model field.

567

568

Args:

569

name: Field name

570

model: Model class

571

572

Returns:

573

Field help text

574

"""

575

576

def flatten_fieldsets(fieldsets: list) -> list:

577

"""

578

Extract field names from nested fieldset structure.

579

580

Args:

581

fieldsets: Nested fieldset configuration

582

583

Returns:

584

Flat list of field names

585

"""

586

587

def normalize_fieldsets(fieldsets: list) -> list:

588

"""

589

Normalize fieldset configuration format.

590

591

Args:

592

fieldsets: Raw fieldset configuration

593

594

Returns:

595

Normalized fieldset structure

596

"""

597

598

def construct_change_message(form, formsets: list, add: bool) -> list:

599

"""

600

Build change message for admin log entries.

601

602

Args:

603

form: Main model form

604

formsets: List of related formsets

605

add: Whether this is object creation

606

607

Returns:

608

List of change descriptions

609

"""

610

```

611

612

### Admin Options

613

614

Configuration constants for admin interface customization.

615

616

```python { .api }

617

HORIZONTAL: int = 1 # Horizontal filter widget layout

618

VERTICAL: int = 2 # Vertical filter widget layout

619

620

# Field display options

621

class FieldListFilter:

622

"""Base class for admin list filters."""

623

624

class ListFilter:

625

"""Base interface for admin list filtering."""

626

627

class AdminCaption:

628

"""Caption display configuration for admin."""

629

630

# Admin template contexts

631

ADMIN_TEMPLATES: dict = {

632

'admin/base.html': 'Base admin template',

633

'admin/change_form.html': 'Object change form template',

634

'admin/change_list.html': 'Object list template',

635

'admin/delete_confirmation.html': 'Delete confirmation template',

636

'admin/object_history.html': 'Object history template',

637

'admin/popup_response.html': 'Popup response template',

638

}

639

```