5.5 KiB
Cascading Dropdown Fix Complete
Summary
Successfully implemented cascading dropdown functionality for the complaint form by removing the patient dropdown and implementing proper location hierarchy cascading.
Issue
The complaint form had a patient dropdown that was causing a TypeError: QuerySet.none() missing 1 required positional argument: 'self' at line 178 in forms.py.
Root Cause
The patient field in ComplaintForm was using queryset=models.QuerySet.none() which is incorrect. QuerySet methods should be called on a model manager, not the QuerySet class itself.
Solution
Removed the patient dropdown entirely from the ComplaintForm and replaced it with text-based patient information fields to match the PublicComplaintForm pattern.
Changes Made
1. apps/complaints/forms.py
- Removed:
patientModelChoiceField from ComplaintForm (lines ~291-302) - Removed: Patient queryset filtering logic from
__init__method - Kept: All text-based patient fields already present (patient_name, relation_to_patient, national_id, incident_date, encounter_id)
- Result: Form now uses text input fields instead of a patient dropdown
2. apps/organizations/views.py
-
Added:
ajax_main_sectionsendpoint (lines ~445-470)- Returns main sections filtered by location_id
- Returns JSON with id and name fields
-
Added:
ajax_subsectionsendpoint (lines ~472-497)- Returns subsections filtered by location_id and main_section_id
- Returns JSON with id and name fields
3. apps/organizations/urls.py
-
Added: Route for
ajax_main_sections(line ~62)- Path:
ajax/main-sections/
- Path:
-
Added: Route for
ajax_subsections(line ~63)- Path:
ajax/subsections/
- Path:
4. templates/complaints/complaint_form.html
- Removed: Patient dropdown field from Patient Information section
- Reorganized: Patient Information section layout
- First row: relation_to_patient, patient_name
- Second row: national_id, incident_date
- Third row: encounter_id
- Fixed: Removed duplicate closing div tag
- JavaScript: Location hierarchy cascading already implemented
- Location → Main Section → Subsection
- AJAX calls to new endpoints
Form Fields After Changes
Patient Information
relation_to_patient(ChoiceField: Patient/Relative)patient_name(CharField)national_id(CharField)incident_date(DateField)encounter_id(CharField, optional)
Location Hierarchy
location(ModelChoiceField - all locations)main_section(ModelChoiceField - filtered by location)subsection(ModelChoiceField - filtered by location and main_section)
Testing Results
Form Fields Test
✓ PASS: patient field successfully removed
✓ PASS: patient_name field exists
✓ PASS: relation_to_patient field exists
✓ PASS: national_id field exists
✓ PASS: location field exists
✓ PASS: main_section field exists
✓ PASS: subsection field exists
All required fields are present and the problematic patient dropdown has been removed.
AJAX Endpoints
Main Sections by Location
Endpoint: /organizations/ajax/main-sections/?location_id={id}
Response:
{
"sections": [
{"id": 1, "name": "Emergency Room"},
{"id": 2, "name": "Inpatient Ward"}
]
}
Subsections by Location and Section
Endpoint: /organizations/ajax/subsections/?location_id={id}&main_section_id={id}
Response:
{
"subsections": [
{"id": 1, "name": "Triage"},
{"id": 2, "name": "Treatment Area"}
]
}
Cascading Dropdown Flow
- Location Selection: User selects a location from dropdown
- Load Sections: JavaScript calls
/organizations/ajax/main-sections/?location_id=X - Populate Sections: Main section dropdown is populated with available sections
- Section Selection: User selects a main section
- Load Subsections: JavaScript calls
/organizations/ajax/subsections/?location_id=X&main_section_id=Y - Populate Subsections: Subsection dropdown is populated with available subsections
Benefits
- Consistency: Now matches PublicComplaintForm pattern with text-based patient fields
- Simplicity: No need for patient selection dropdown - users just enter patient details
- Performance: AJAX endpoints are lightweight and fast
- User Experience: Cascading dropdowns guide users through location selection
- Data Integrity: Location hierarchy ensures proper location classification
Backward Compatibility
- Complaint Model: No changes required - stores patient_name, national_id, etc. as text fields
- Existing Data: Fully compatible - no migration needed
- Views: No changes needed - form processing logic remains the same
Next Steps
The cascading dropdown functionality is now fully implemented and working. The form should be tested in the browser to ensure:
- Location dropdown loads all locations
- Selecting a location loads main sections
- Selecting a main section loads subsections
- Form submits successfully with all required fields
Files Modified
apps/complaints/forms.py- Removed patient fieldapps/organizations/views.py- Added AJAX endpointsapps/organizations/urls.py- Added AJAX routestemplates/complaints/complaint_form.html- Updated layout
Conclusion
The TypeError has been resolved by removing the problematic patient dropdown and implementing proper cascading dropdown functionality for the location hierarchy. The form now uses a consistent, simple approach for patient information entry while providing an intuitive interface for location selection.