Search code examples
djangodjango-rest-frameworkdjango-viewsdjango-formsdjango-generic-views

How to query database based on user inputs and show results in another page?


Good day everyone. I am trying to build a form which queries the database based on user data inputs and then returns the results in a new page. but I don't know exactly how to do it and I am getting errors. I've looked for a solution but couldn't find any. Please help me if you know any solutions. Thanks in advance. Here are my codes:

forms.py
class AttendanceForm(forms.Form):
    course = forms.CharField(max_length=50)
    department = forms.CharField(max_length=10)
    semester = forms.IntegerField()


views.py
class AttendanceForm(generic.FormView):
    form_class = CrsAttForm
    template_name = 'office/crsatt_form.html'
    success_url = reverse_lazy('office:members_list')

class MembersList(generic.ListView):
    template_name = "office/crs_att.html"
    context_object_name = 'members'

    def get_queryset(self):
        return Members.objects.all()
    # I know I should use .filter method but how could I set the parameters to data received from the form 




urls.py
url(r'^CourseAttendanceForm/$', views.AttendanceForm.as_view(), name='courseattendance'),
url(r'^CourseAttendanceForm/Results/$',views.MembersList.as_view(), name='memebrs_list'),

Solution

  • I think that it will be easier for you to use function based views for this one. You can do it like this:

    views.py
    def form_page(request):
        form = AttendanceForm()
        # you get to this "if" if the form has been filled by the user
        if request.method == "POST":
            form = AttendanceForm(request.POST)
            if form.is_valid():
                course = request.POST['course']
                department = request.POST['department']
                semester = request.POST['semester']
                members = Member.objects.filter(#here you do your filters as you already have the course, department and semester variables)
                context = {'members': members}
                return render(request, 'second_page.html', context)
        # if the form hasn't been filled by the user you display the form
        context = {'form': form}
        return render(request, 'form_page.html', context)
    
    
    form_page.html
    <form method="post" action="{% url 'form_page' %}">
    {% csrf_token %}
    {{ form }}
    <button type="submit">Search!</button>
    </form>
    
    
    urls.py
    path('form_page/', views.form_page, name='form_page')
    
    
    second_page.html
    {% for member in members %}
    # here you display whatever you want to
    {% endfor %}