Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to pass data between django views

This questions addresses my question genearally, but I am looking for a more specific explanation.

I would like a user to update a a group of model objects, however, the queryset for these objects will need to be retrieved first. My plan is to do this in two seperate URs/views, getting the query set info from the first, then displaying the model formset to be updated next.

My first view gives a list of all the the "Project"s (One of my models), and retrieves the id of the project selected.

Here is the form:

class ProjectLookupForm(forms.Form):
    Project_Name = chosenforms.ChosenModelChoiceField(queryset=Project.objects.all())

and here is the view:

def update_project_filter(request):
    project_form = ProjectLookupForm(request.POST or None)
    if request.method == 'POST':
        if project_form.is_valid():
            context = {"project_form":project_form}
            # Get project here and share it with the next view.
            selected_project_id = project_form.cleaned_data["Project_Name"].id
            # Add a new return statement here?
            # Or call update project view from here?
            # Add a redirect button to html?
        else:
            errors = project_form.errors
            context = {"errors":errors, "project_form":project_form}
    else:
        context = {"project_form":project_form}
    return render(request, 'filter_update_project_form.html', context)

As one can see, I have included some comments brainstorming what my possibilities are. My goal is to send the selected_project_id to this next view, so that it can use that id as a model form query set.

def update_project(request):
    UpdateFormset = modelformset_factory(Sample, fields=("sample_name", "extraction_date", 
                                                     "project", "order", "notebook", "notebook_page"))
    if request.method == 'POST':
        formset = UpdateFormset(request.POST, request.FILES)
        if formset.is_valid():
            formset.save()
            context = {"formset": formset, "project_form":project_form}
        else:
            errors = formset.errors
            context = {"formset":formset, "errors":errors, "project_form":project_form}
    else:
        formset = UpdateFormset(queryset=Sample.objects.filter(project=2))
        context = {"formset":formset, "project_form":project_form}
    return render(request, 'update_project_form.html', context)

One can see here that I have hard coded the queryset like so:

queryset=Sample.objects.filter(project=2)

How can I set "project=" to my selected_project_id? Do I pass this info to the view as an input parameter? Or do I send it to the next URL and take it from there?

like image 408
Malonge Avatar asked Sep 25 '15 17:09

Malonge


People also ask

Can a view call another view Django?

To call a view from within another view with Python Django, we can call the view function directly. to call view1 in view2 . And then we can get the response returned and do what we want with it before we return the response. We can also return the response directly in view2`.

What is a more efficient way to pass variables from template to view in Django?

POST form (your current approach) This answer is perfect and I learned a great deal!

How do Views work in Django?

In the Django framework, views are Python functions or classes that receive a web request and return a web response. The response can be a simple HTTP response, an HTML template response, or an HTTP redirect response that redirects a user to another page.


1 Answers

Assuming you've activated django.contrib.sessions.middleware.SessionMiddleware; you can pass data between views using request.session dictionary as follows:

def update_project_filter(request):
    ...
    selected_project_id = project_form.cleaned_data["Project_Name"].id
    request.session['selected_project_id'] = selected_project_id
    ...

def update_project(request):
    ...
    selected_project_id = request.session.get('selected_project_id')
    ...
like image 154
Ozgur Vatansever Avatar answered Oct 23 '22 03:10

Ozgur Vatansever