Django: передача контекста в другое представление - PullRequest
0 голосов
/ 16 февраля 2020

Я пытаюсь передать свой контекст элементов в другое представление, используя только подробные данные c элемента, но у меня возникают проблемы даже с поиском правильной документации о том, как это работает.

Мне нужно перевести мой пакет Speci c в другое представление и иметь все его свойства, такие как зависимости, описание, домашняя страница и т. Д. c, но я не знаю, какой правильный / правильный способ даже передать эти в другой вид?

Просмотры:

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)

URL:

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 - шаблон:

{% 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 %}

подробный шаблон просмотра:

{% 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 %}

1 Ответ

2 голосов
/ 16 февраля 2020

Просто извлеките этот кусок логики c в функцию и используйте его в обоих представлениях:

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)
...