Reputation: 117
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
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