kryptonian
kryptonian

Reputation: 117

Django: Passing context to another view

I'm trying to pass my context of items to another view, with only the specific item's details, but I'm having trouble to even find the correct documentation on how this works.

I need to get my specific package to another view, and have all of it's properties with it, like dependencies, description, homepage etc, but I don't know what's the correct/proper way to even pass those to another view?

Views:

from django.shortcuts import render
import re, random


def index(request):
    packages = {}
    latset_header = None

    with open("app/packages/status.real.txt", encoding="UTF-8") as f:
        for l in f:
            l = l.strip()
            # if line contains a keyword
            if "Package: " in l:
                latset_header = l.replace("Package: ", "")
                packages[latset_header] = {'name': latset_header}
            elif "Depends: " in l:
                packages[latset_header]['depends'] = l.replace("Depends: ", "")
            elif "Description: " in l:
                packages[latset_header]["description"] = l.replace("Description: ", "")
            elif "Homepage: " in l:
                packages[latset_header]["homepage"] = l.replace("Homepage: ", "")

    context = {'items': packages}

    return render(request, 'packages_index.html', context)


def show_package_details(request, package):
    context = {'item': package}
    return render(request, 'packages_details.html', context)

Urls:

from django.urls import include, path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
    path('<str:package>', views.show_package_details, name='package-details')
]

packages_index.html - template:

{% extends "home.html" %}

{% block container %}
    <h2>The packages</h2>
    {% if items %}
        <ul>
            {% for item, value in items.items %}
                <li>
                    <a href="{{item}}">{{ item }}</a>
                </li>
            {% endfor %}
        </ul>
    {% else %}
        <p>No items available.</p>
    {% endif %}
{% endblock %}

Package details view template:

{% extends "home.html" %}

{% block container %}
    {% if item %}
        <h2>Details of {{ item }}</h2>
        <p>Dependencies: {{ item.dependencies }}</p>
    {% else %}
        <p>No item can be seen.</p>
    {% endif %}
{% endblock %}

Upvotes: 1

Views: 1259

Answers (1)

bug
bug

Reputation: 4130

Just extract that piece of logic into a function and use it on both views:

from django.shortcuts import render
import re, random


def get_packages():
    packages = {}
    latset_header = None

    with open("app/packages/status.real.txt", encoding="UTF-8") as f:
        for l in f:
            l = l.strip()
            # if line contains a keyword
            if "Package: " in l:
                latset_header = l.replace("Package: ", "")
                packages[latset_header] = {'name': latset_header}
            elif "Depends: " in l:
                packages[latset_header]['depends'] = l.replace("Depends: ", "")
            elif "Description: " in l:
                packages[latset_header]["description"] = l.replace("Description: ", "")
            elif "Homepage: " in l:
                packages[latset_header]["homepage"] = l.replace("Homepage: ", "")

    return packages


def index(request):
    context = {'items': get_packages()}
    return render(request, 'packages_index.html', context)


def show_package_details(request, package):
    context = {'item': get_packages()}
    return render(request, 'packages_details.html', context)

Upvotes: 3

Related Questions