File tree 2 files changed +40
-0
lines changed
2 files changed +40
-0
lines changed Original file line number Diff line number Diff line change 1
1
from django .conf import settings
2
+ from django .core .exceptions import ValidationError
2
3
from django .core .validators import FileExtensionValidator
3
4
from django .forms import FileField
4
5
from django_file_form .fields import MultipleUploadedFileField , UploadedFileField
@@ -13,6 +14,8 @@ class MultiFileField(MultipleUploadedFileField):
13
14
widget = MultiFileFieldWidget
14
15
15
16
def clean (self , value , initial ):
17
+ if self .required and not value :
18
+ raise ValidationError (self .error_messages ["required" ], code = "required" )
16
19
if not value :
17
20
return []
18
21
old_files = [
@@ -56,6 +59,8 @@ class SingleFileField(UploadedFileField):
56
59
widget = SingleFileFieldWidget
57
60
58
61
def clean (self , value , initial ):
62
+ if self .required and not value and not initial :
63
+ raise ValidationError (self .error_messages ["required" ], code = "required" )
59
64
if not value :
60
65
return
61
66
if hasattr (value , "is_placeholder" ) and value .is_placeholder and initial :
Original file line number Diff line number Diff line change @@ -27,4 +27,39 @@ htmx.onLoad(function () {
27
27
} ) ;
28
28
}
29
29
}
30
+
31
+ // Handle client side validation for required file fields
32
+ let fileInputs = document . querySelectorAll ( "input[type='file'][required]" ) ;
33
+
34
+ fileInputs . forEach ( ( input ) => {
35
+ input . addEventListener ( "invalid" , function ( event ) {
36
+ event . preventDefault ( ) ; // Prevent default browser behavior
37
+
38
+ let errorMessage = "This field is required." ;
39
+ // Find the closest dff-uploader wrapper and display an error
40
+ let container = input . closest ( ".form__item" ) ;
41
+
42
+ let errorDiv = container . querySelector ( ".form__error-text" ) ;
43
+
44
+ errorDiv = document . createElement ( "p" ) ;
45
+ errorDiv . classList . add ( "form__error-text" ) ;
46
+ container . appendChild ( errorDiv ) ;
47
+ errorDiv . innerText = errorMessage ; // Show error message
48
+ } ) ;
49
+
50
+ input . addEventListener ( "change" , function ( ) {
51
+ let container = input . closest ( ".form__item" ) ;
52
+ let errorDiv = container . querySelector ( ".form__error-text" ) ;
53
+
54
+ if ( errorDiv ) {
55
+ if (
56
+ input . files . length > 0 ||
57
+ container . querySelector ( ".dff-file" ) !== null
58
+ ) {
59
+ errorDiv . classList . remove ( "form__error-text" ) ;
60
+ errorDiv . innerText = "" ; // Clear the error only when a file is selected
61
+ }
62
+ }
63
+ } ) ;
64
+ } ) ;
30
65
} ) ;
You can’t perform that action at this time.
0 commit comments