@@ -2,35 +2,54 @@ import datetime
2
2
from collections .abc import Collection , Iterator , Sequence
3
3
from decimal import Decimal
4
4
from 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
6
6
from uuid import UUID
7
7
8
8
from django .core .files import File
9
9
from django .core .validators import _ValidatorCallable
10
10
from django .db .models .fields import _ErrorMessagesDict , _ErrorMessagesMapping
11
11
from django .forms .boundfield import BoundField
12
12
from 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
+ )
14
30
from django .utils .choices import CallableChoiceIterator , _ChoicesCallable , _ChoicesInput
15
31
from django .utils .datastructures import _PropertyDescriptor
16
32
from django .utils .functional import _StrOrPromise
17
33
34
+ _ClassWidget = TypeVar ("_ClassWidget" , bound = Widget )
35
+ _InstanceWidget = TypeVar ("_InstanceWidget" , bound = Widget , default = _ClassWidget )
36
+
18
37
@type_check_only
19
- class _WidgetTypeOrInstance :
38
+ class _WidgetTypeOrInstance ( Generic [ _ClassWidget , _InstanceWidget ]) :
20
39
@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 : ...
22
41
@overload
23
- def __get__ (self , instance : Field , owner : type [Field ]) -> Widget : ...
42
+ def __get__ (self , instance : Field , owner : type [Field ]) -> _InstanceWidget : ...
24
43
@overload
25
- def __set__ (self , instance : None , value : type [Widget ] | Widget ) -> None : ...
44
+ def __set__ (self , instance : None , value : type [_ClassWidget ] | _ClassWidget ) -> None : ...
26
45
@overload
27
- def __set__ (self , instance : Field , value : Widget ) -> None : ...
46
+ def __set__ (self , instance : Field , value : _InstanceWidget ) -> None : ...
28
47
29
48
class Field :
30
49
initial : Any
31
50
label : _StrOrPromise | None
32
51
required : bool
33
- widget : _WidgetTypeOrInstance
52
+ widget : _WidgetTypeOrInstance [ TextInput ]
34
53
hidden_widget : type [Widget ]
35
54
default_validators : list [_ValidatorCallable ]
36
55
default_error_messages : ClassVar [_ErrorMessagesDict ]
@@ -69,6 +88,7 @@ class Field:
69
88
def get_bound_field (self , form : BaseForm , field_name : str ) -> BoundField : ...
70
89
71
90
class CharField (Field ):
91
+ widget : _WidgetTypeOrInstance [TextInput ] # type: ignore[assignment]
72
92
max_length : int | None
73
93
min_length : int | None
74
94
strip : bool
@@ -96,6 +116,7 @@ class CharField(Field):
96
116
def widget_attrs (self , widget : Widget ) -> dict [str , Any ]: ...
97
117
98
118
class IntegerField (Field ):
119
+ widget : _WidgetTypeOrInstance [NumberInput ] # type: ignore[assignment]
99
120
max_value : int | None
100
121
min_value : int | None
101
122
step_size : int | None
@@ -193,17 +214,20 @@ class BaseTemporalField(Field):
193
214
def strptime (self , value : str , format : str ) -> Any : ...
194
215
195
216
class DateField (BaseTemporalField ):
217
+ widget : _WidgetTypeOrInstance [DateInput ] # type: ignore[assignment]
196
218
def to_python (self , value : None | str | datetime .datetime | datetime .date ) -> datetime .date | None : ...
197
219
def strptime (self , value : str , format : str ) -> datetime .date : ...
198
220
199
221
class TimeField (BaseTemporalField ):
222
+ widget : _WidgetTypeOrInstance [TimeInput ] # type: ignore[assignment]
200
223
def to_python (self , value : None | str | datetime .time ) -> datetime .time | None : ...
201
224
def strptime (self , value : str , format : str ) -> datetime .time : ...
202
225
203
226
class DateTimeFormatsIterator :
204
227
def __iter__ (self ) -> Iterator [str ]: ...
205
228
206
229
class DateTimeField (BaseTemporalField ):
230
+ widget : _WidgetTypeOrInstance [DateTimeInput ] # type: ignore[assignment]
207
231
def to_python (self , value : None | str | datetime .datetime | datetime .date ) -> datetime .datetime | None : ...
208
232
def strptime (self , value : str , format : str ) -> datetime .datetime : ...
209
233
@@ -235,6 +259,7 @@ class RegexField(CharField):
235
259
) -> None : ...
236
260
237
261
class EmailField (CharField ):
262
+ widget : _WidgetTypeOrInstance [EmailInput ] # type: ignore[assignment]
238
263
def __init__ (
239
264
self ,
240
265
* ,
@@ -256,6 +281,7 @@ class EmailField(CharField):
256
281
) -> None : ...
257
282
258
283
class FileField (Field ):
284
+ widget : _WidgetTypeOrInstance [ClearableFileInput ] # type: ignore[assignment]
259
285
allow_empty_file : bool
260
286
max_length : int | None
261
287
def __init__ (
@@ -285,6 +311,7 @@ class ImageField(FileField):
285
311
def widget_attrs (self , widget : Widget ) -> dict [str , Any ]: ...
286
312
287
313
class URLField (CharField ):
314
+ widget : _WidgetTypeOrInstance [URLInput ] # type: ignore[assignment]
288
315
def __init__ (
289
316
self ,
290
317
* ,
@@ -308,15 +335,18 @@ class URLField(CharField):
308
335
def to_python (self , value : Any | None ) -> str | None : ...
309
336
310
337
class BooleanField (Field ):
338
+ widget : _WidgetTypeOrInstance [CheckboxInput ] # type: ignore[assignment]
311
339
def to_python (self , value : Any | None ) -> bool : ...
312
340
def validate (self , value : Any ) -> None : ...
313
341
def has_changed (self , initial : Any | None , data : Any | None ) -> bool : ...
314
342
315
343
class NullBooleanField (BooleanField ):
344
+ widget : _WidgetTypeOrInstance [NullBooleanSelect ] # type: ignore[assignment]
316
345
def to_python (self , value : Any | None ) -> bool | None : ... # type: ignore[override]
317
346
def validate (self , value : Any ) -> None : ...
318
347
319
348
class ChoiceField (Field ):
349
+ widget : _WidgetTypeOrInstance [Select ] # type: ignore[assignment]
320
350
choices : _PropertyDescriptor [
321
351
_ChoicesInput | _ChoicesCallable | CallableChoiceIterator ,
322
352
_ChoicesInput | CallableChoiceIterator ,
@@ -371,6 +401,7 @@ class TypedChoiceField(ChoiceField):
371
401
def clean (self , value : Any ) -> Any : ...
372
402
373
403
class MultipleChoiceField (ChoiceField ):
404
+ widget : _WidgetTypeOrInstance [SelectMultiple ] # type: ignore[assignment]
374
405
def to_python (self , value : Any | None ) -> list [str ]: ...
375
406
def validate (self , value : Any ) -> None : ...
376
407
def has_changed (self , initial : Collection [Any ] | None , data : Collection [Any ] | None ) -> bool : ...
@@ -474,6 +505,7 @@ class FilePathField(ChoiceField):
474
505
) -> None : ...
475
506
476
507
class SplitDateTimeField (MultiValueField ):
508
+ widget : _WidgetTypeOrInstance [SplitDateTimeWidget ] # type: ignore[assignment]
477
509
def __init__ (
478
510
self ,
479
511
* ,
@@ -548,6 +580,7 @@ class JSONString(str): ...
548
580
549
581
class JSONField (CharField ):
550
582
default_error_messages : ClassVar [_ErrorMessagesDict ]
583
+ widget : _WidgetTypeOrInstance [Textarea ] # type: ignore[assignment]
551
584
encoder : Any
552
585
decoder : Any
553
586
def __init__ (self , encoder : Any | None = None , decoder : Any | None = None , ** kwargs : Any ) -> None : ...
0 commit comments