Use Filament v3 Infolists for Read-Only Admin Detail Views
Display model attributes in Filament admin panels without edit inputs by using v3 Infolists instead of Forms.
07 May 2026, 21:11 UTC

The problem: your detail page looks like an edit form
You just generated a Filament Resource for a Post model. The edit page works, but the view page still shows input fields, save buttons, and validation rules. Users can accidentally change published dates or toggle statuses from a page meant only for inspection. Filament Forms are built for mutation, not display.
What Infolists do in Filament v3
Filament v3 separates read-only presentation from editable input through Infolists. An Infolist is a schema of entries—TextEntry, ImageEntry, ToggleEntry, and EntryGroup—that render model attributes without HTML form inputs. You attach an Infolist to a Resource page, a custom Livewire component, or any class that implements Filament’s Infolist contract.
Unlike a Form, an Infolist does not handle validation, authorization for writes, or database persistence. It is strictly for showing data.
Worked example: display a Post record without edit inputs
Assume your project requires filament/filament version 3.x in composer.json. Open your terminal in the Laravel project root and generate a resource:
php artisan make:filament-resource PostResource --generate
Run this as the user account that owns the project files. The command generates PHP classes under App\Filament\Resources\; it does not modify the database, so there is no data rollback. The main risk is overwriting an existing file if the resource name collides.
Open the generated resource and add entries to the infolist() method:
<?php
namespace App\Filament\Resources;
use App\Models\Post;
use Filament\Resources\Resource;
use Filament\Infolists;
use Filament\Infolists\Components\TextEntry;
use Filament\Infolists\Components\ImageEntry;
use Filament\Infolists\Components\ToggleEntry;
use Filament\Infolists\Components\EntryGroup;
class PostResource extends Resource
{
protected static ?string $model = Post::class;
public static function infolist(Infolist $infolist): Infolist
{
return $infolist
->schema([
EntryGroup::make('Post details')
->schema([
TextEntry::make('title')
->label('Title')
->wrap(),
TextEntry::make('slug')
->label('URL slug'),
ToggleEntry::make('is_published')
->label('Published'),
]),
ImageEntry::make('featured_image')
->label('Featured image')
->disk('public')
->height(200),
]);
}
}
Open the view page for an existing record, typically at a path such as /admin/posts/1. The page should render title, slug, published state, and image as static content. Expect no save button and no input fields. If you see editable inputs, you are likely on the edit page driven by form(), not the view page driven by infolist().
Trade-offs and limitations
- Infolists are read-only. They do not validate input, authorize writes, or persist changes to the database.
- Custom entries require familiarity with Filament component schemas, Livewire, and Alpine.js conventions.
- Component names and APIs differ between Filament v2 and v3; this pattern targets v3 stable releases.
Check that it works
- Confirm
filament/filamentis version 3.x in composer.json. - Open the resource class and verify
infolist()returns entry components, not form components. - Open the view page in the browser and confirm attributes render without
<input>,<select>, or save controls.
If users need to edit the same attributes, keep a separate form() method on the edit page. Use Infolists when the page’s job is inspection, not modification.
0 replies
A thoughtful contribution can make all the difference. Be the first to share one.