@@ -2,35 +2,54 @@ import datetime
22from collections .abc import Collection , Iterator , Sequence
33from decimal import Decimal
44from re import Pattern
5- from typing import Any , ClassVar , Protocol , overload , type_check_only
5+ from typing import Any , ClassVar , Generic , Protocol , TypeVar , overload , type_check_only
66from uuid import UUID
77
88from django .core .files import File
99from django .core .validators import _ValidatorCallable
1010from django .db .models .fields import _ErrorMessagesDict , _ErrorMessagesMapping
1111from django .forms .boundfield import BoundField
1212from django .forms .forms import BaseForm
13- from django .forms .widgets import Widget
13+ from django .forms .widgets import (
14+ CheckboxInput ,
15+ ClearableFileInput ,
16+ DateInput ,
17+ DateTimeInput ,
18+ EmailInput ,
19+ NullBooleanSelect ,
20+ NumberInput ,
21+ Select ,
22+ SelectMultiple ,
23+ SplitDateTimeWidget ,
24+ Textarea ,
25+ TextInput ,
26+ TimeInput ,
27+ URLInput ,
28+ Widget ,
29+ )
1430from django .utils .choices import CallableChoiceIterator , _ChoicesCallable , _ChoicesInput
1531from django .utils .datastructures import _PropertyDescriptor
1632from django .utils .functional import _StrOrPromise
1733
34+ _ClassWidget = TypeVar ("_ClassWidget" , bound = Widget )
35+ _InstanceWidget = TypeVar ("_InstanceWidget" , bound = Widget , default = _ClassWidget )
36+
1837@type_check_only
19- class _WidgetTypeOrInstance :
38+ class _WidgetTypeOrInstance ( Generic [ _ClassWidget , _InstanceWidget ]) :
2039 @overload
21- def __get__ (self , instance : None , owner : type [Field ]) -> type [Widget ] | Widget : ...
40+ def __get__ (self , instance : None , owner : type [Field ]) -> type [_ClassWidget ] | _ClassWidget : ...
2241 @overload
23- def __get__ (self , instance : Field , owner : type [Field ]) -> Widget : ...
42+ def __get__ (self , instance : Field , owner : type [Field ]) -> _InstanceWidget : ...
2443 @overload
25- def __set__ (self , instance : None , value : type [Widget ] | Widget ) -> None : ...
44+ def __set__ (self , instance : None , value : type [_ClassWidget ] | _ClassWidget ) -> None : ...
2645 @overload
27- def __set__ (self , instance : Field , value : Widget ) -> None : ...
46+ def __set__ (self , instance : Field , value : _InstanceWidget ) -> None : ...
2847
2948class Field :
3049 initial : Any
3150 label : _StrOrPromise | None
3251 required : bool
33- widget : _WidgetTypeOrInstance
52+ widget : _WidgetTypeOrInstance [ TextInput ]
3453 hidden_widget : type [Widget ]
3554 default_validators : list [_ValidatorCallable ]
3655 default_error_messages : ClassVar [_ErrorMessagesDict ]
@@ -96,6 +115,7 @@ class CharField(Field):
96115 def widget_attrs (self , widget : Widget ) -> dict [str , Any ]: ...
97116
98117class IntegerField (Field ):
118+ widget : _WidgetTypeOrInstance [NumberInput ] # type: ignore[assignment]
99119 max_value : int | None
100120 min_value : int | None
101121 step_size : int | None
@@ -193,17 +213,20 @@ class BaseTemporalField(Field):
193213 def strptime (self , value : str , format : str ) -> Any : ...
194214
195215class DateField (BaseTemporalField ):
216+ widget : _WidgetTypeOrInstance [DateInput ] # type: ignore[assignment]
196217 def to_python (self , value : None | str | datetime .datetime | datetime .date ) -> datetime .date | None : ...
197218 def strptime (self , value : str , format : str ) -> datetime .date : ...
198219
199220class TimeField (BaseTemporalField ):
221+ widget : _WidgetTypeOrInstance [TimeInput ] # type: ignore[assignment]
200222 def to_python (self , value : None | str | datetime .time ) -> datetime .time | None : ...
201223 def strptime (self , value : str , format : str ) -> datetime .time : ...
202224
203225class DateTimeFormatsIterator :
204226 def __iter__ (self ) -> Iterator [str ]: ...
205227
206228class DateTimeField (BaseTemporalField ):
229+ widget : _WidgetTypeOrInstance [DateTimeInput ] # type: ignore[assignment]
207230 def to_python (self , value : None | str | datetime .datetime | datetime .date ) -> datetime .datetime | None : ...
208231 def strptime (self , value : str , format : str ) -> datetime .datetime : ...
209232
@@ -235,6 +258,7 @@ class RegexField(CharField):
235258 ) -> None : ...
236259
237260class EmailField (CharField ):
261+ widget : _WidgetTypeOrInstance [EmailInput ] # type: ignore[assignment]
238262 def __init__ (
239263 self ,
240264 * ,
@@ -256,6 +280,7 @@ class EmailField(CharField):
256280 ) -> None : ...
257281
258282class FileField (Field ):
283+ widget : _WidgetTypeOrInstance [ClearableFileInput ] # type: ignore[assignment]
259284 allow_empty_file : bool
260285 max_length : int | None
261286 def __init__ (
@@ -285,6 +310,7 @@ class ImageField(FileField):
285310 def widget_attrs (self , widget : Widget ) -> dict [str , Any ]: ...
286311
287312class URLField (CharField ):
313+ widget : _WidgetTypeOrInstance [URLInput ] # type: ignore[assignment]
288314 def __init__ (
289315 self ,
290316 * ,
@@ -308,15 +334,18 @@ class URLField(CharField):
308334 def to_python (self , value : Any | None ) -> str | None : ...
309335
310336class BooleanField (Field ):
337+ widget : _WidgetTypeOrInstance [CheckboxInput ] # type: ignore[assignment]
311338 def to_python (self , value : Any | None ) -> bool : ...
312339 def validate (self , value : Any ) -> None : ...
313340 def has_changed (self , initial : Any | None , data : Any | None ) -> bool : ...
314341
315342class NullBooleanField (BooleanField ):
343+ widget : _WidgetTypeOrInstance [NullBooleanSelect ] # type: ignore[assignment]
316344 def to_python (self , value : Any | None ) -> bool | None : ... # type: ignore[override]
317345 def validate (self , value : Any ) -> None : ...
318346
319347class ChoiceField (Field ):
348+ widget : _WidgetTypeOrInstance [Select ] # type: ignore[assignment]
320349 choices : _PropertyDescriptor [
321350 _ChoicesInput | _ChoicesCallable | CallableChoiceIterator ,
322351 _ChoicesInput | CallableChoiceIterator ,
@@ -371,6 +400,7 @@ class TypedChoiceField(ChoiceField):
371400 def clean (self , value : Any ) -> Any : ...
372401
373402class MultipleChoiceField (ChoiceField ):
403+ widget : _WidgetTypeOrInstance [SelectMultiple ] # type: ignore[assignment]
374404 def to_python (self , value : Any | None ) -> list [str ]: ...
375405 def validate (self , value : Any ) -> None : ...
376406 def has_changed (self , initial : Collection [Any ] | None , data : Collection [Any ] | None ) -> bool : ...
@@ -474,6 +504,7 @@ class FilePathField(ChoiceField):
474504 ) -> None : ...
475505
476506class SplitDateTimeField (MultiValueField ):
507+ widget : _WidgetTypeOrInstance [SplitDateTimeWidget ] # type: ignore[assignment]
477508 def __init__ (
478509 self ,
479510 * ,
@@ -548,6 +579,7 @@ class JSONString(str): ...
548579
549580class JSONField (CharField ):
550581 default_error_messages : ClassVar [_ErrorMessagesDict ]
582+ widget : _WidgetTypeOrInstance [Textarea ] # type: ignore[assignment]
551583 encoder : Any
552584 decoder : Any
553585 def __init__ (self , encoder : Any | None = None , decoder : Any | None = None , ** kwargs : Any ) -> None : ...
0 commit comments