search Functionality

forms.py

class SearchForm(forms.ModelForm):
    class Meta:
        model = Student
        fields = ['first_name', 'last_name', 'email', 'date_of_birth']

    def __init__(self, *args, **kwargs):
        super(SearchForm, self).__init__(*args, **kwargs)
        self.fields['first_name'].required = False
        self.fields['last_name'].required = False
        self.fields['email'].required = False
        self.fields['date_of_birth'].required = False
     
        for field_name, field in self.fields.items():
            field.widget.attrs.update({
                'class': 'form-control',
                'id': f"defaultForm-{field_name}",
            })   
            
 class StudentDetailsForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        for field in self.fields.values():
            field.widget.attrs['disabled'] = True

    class Meta:
        model = Student
        fields = '__all__'           

views.py


from django.shortcuts import render, redirect,get_object_or_404
from .forms import StudentForm,SearchForm,StudentDetailsForm
from .models import Student

def find_student(request):
    if request.method == 'POST':
        form = SearchForm(request.POST)
        if form.is_valid():
            filter_kwargs = {}

            first_name = form.cleaned_data['first_name']
            if first_name:
                filter_kwargs['first_name__icontains'] = first_name

            last_name = form.cleaned_data['last_name']
            if last_name:
                filter_kwargs['last_name__icontains'] = last_name

            email = form.cleaned_data['email']
            if email:
                filter_kwargs['email__icontains'] = email

            date_of_birth = form.cleaned_data['date_of_birth']
            if date_of_birth:
                filter_kwargs['date_of_birth'] = date_of_birth

            # Perform the search using the form input
            students = Student.objects.filter(**filter_kwargs)
            if students.count() == 1:
                # Only one result found, redirect to the update form
                students = students.first()
                form = StudentForm(instance=students)
                return render(request, 'students/student_form.html', {'form': form})
            # Pass the search results to the template
            context = {'students': students}
            return render(request, 'students/search_results.html', context)
    else:
        form = SearchForm()

    return render(request, 'students/search_form.html', {'form': form})
def student_details(request, student_id):
    student = get_object_or_404(Student, id=student_id)
    form = StudentDetailsForm(instance=student)
    return render(request, 'students/student_details.html', {'form': form})

students/search_form.html

{% extends 'base.html' %} 

{% block content %}
<!-- এখানে কনটেন্ট পরিবর্তনের কোড থাকবে -->

<h1></h1>

<form method="post" action="{% url 'find_student' %}">
  {% csrf_token %}
  {% for field in form %}
  <div class="col-md-4 mb-4">
    <div class="form-group">
      <label for="{{ field.auto_id }}">{{ field.label }}</label>
      <div class="input-group">
        <div class="input-group-prepend">
          <span class="input-group-text">
            <i class="fas fa-envelope"></i>
          </span>
        </div>
        {{ field }}
      </div>
    </div>
  </div>
{% endfor %}
<div class="text-center">  <button class="btn btn-primary" type="submit">Search</button></div>
</form>

<a href="{% url 'student_list' %}">Back to list</a>
{% endblock %}

<!-- students/student_form.html -->

students/search_results.html

<!-- search_results.html -->
{% if students %}
  <h1>Search Results:</h1>
  <ul>
    {% for student in students %}
      <li>{{ student.first_name }} {{ student.last_name }} <a href="{% url 'student_details' student.id %}">{{ student.first_name }}</a></p></li>
    {% endfor %}
  </ul>
{% else %}
  <p>No students found.</p>
{% endif %}

students/student_details.html

<!-- student_details.html -->
<h1>Student Details</h1>
<form>
    {{ form.as_p }}
</form>

urls.py

from django.urls import path
from .views import student_list, student_create, student_update, student_delete,find_student,student_details

urlpatterns = [
    path('students/<int:student_id>/', student_details, name='student_details'),
    path('find/', find_student, name='find_student'),

Last updated