Mezzanine игнорирует представление, отображает шаблон, но не передает контекст

Я создал представление для своей модели с соответствующими URL-адресами и файлами шаблонов. Затем в панели администратора я создал страницу с форматированным текстом, указав тот же URL-адрес (ингредиенты), который определен в шаблонах URL-адресов. Mezzanine игнорирует представление, отображает шаблон, но не передает контекст. Как я могу это решить?

Это коды:

models.py

from django.db import models
from mezzanine.pages.models import Page
from django.utils.translation import ugettext_lazy as _

class Ingredient(Page):
    name = models.CharField(max_length=60)
    information = models.TextField(null=True, blank=True, verbose_name=_("Description"))

views.py

from django.template.response import TemplateResponse
from .models import Ingredient

def ingredients(request):
    ingredients = Ingredient.objects.all().order_by('name')
    templates = ["pages/ingredients.html"]
    return TemplateResponse(request, templates, {'ingredients':ingredients})

urls.py

from django.conf.urls import url
from .views import ingredients

urlpatterns = [
    url("^$", ingredients, name="ingredients"),
]

person Rainell    schedule 09.09.2017    source источник


Ответы (2)


TemplateResponse не ожидает запроса в своих аргументах. См. документацию.

 return TemplateResponse(templates, {'ingredients':ingredients})

Однако я ожидаю, что вы хотели использовать стандартную функцию render:

return render(request, "pages/ingredients.html", {'ingredients':ingredients})
person Daniel Roseman    schedule 09.09.2017
comment
Затем я взглянул на приложения для блогов и галерей и, увидев, что они используют TemplateResponse, захотел попробовать. Дело в том, что это не работает, так или иначе. Это был код, который я написал с помощью рендеринга: from django.shortcuts import render from .models import Ingredient def ingredients(request): ingredients = Ingredient.objects.all().order_by('name') return render(request, 'pages/ingredients.html', {'ingredients': ingredients}) - person Rainell; 09.09.2017
comment
Вы уверены, что используется правильное представление? На самом деле я ожидал, что ваша первоначальная попытка даст ошибку. - person Daniel Roseman; 09.09.2017
comment
Вернулся к версии с рендером, никакой ошибки не выдает. Я уверен, что просмотр не запускается, но я не знаю, почему? Mezzanine ведет себя так, как будто представления не существует, я не думаю, что есть какие-то проблемы с кодом, иначе django выдал бы ошибку. Может быть проблема с конфигурацией или структурой, но я понятия не имею, что это может быть. - person Rainell; 09.09.2017
comment
Предположительно проблема с URL. Где этот urls.py включен? Какой именно URL вы собираетесь? - person Daniel Roseman; 09.09.2017
comment
Я отвечаю на ваш вопрос о двух тестах, которые я сделал. В первом случае мое приложение находится в папке приложений моего проекта, тогда файл urls.py находится в папке моего приложения project_folder/apps/my_app_folder/urls.py. Во втором случае я удалил свое приложение из папки проекта и включил его в мезонин как мезонинное приложение на том же уровне блога, галереи и т. д., поэтому путь urls.py — mezzanine/my_app_folder/urls.py. Ни в том, ни в другом случае это не работает. - person Rainell; 09.09.2017
comment
в обоих случаях пользовательский тип контента (ингредиент) работает нормально, я могу создавать новые страницы с этим типом контента, страницы можно просматривать на сайте и т. д. Это означает, что Mezzanine интерпретирует models.py, admin.py и шаблон для пользовательский тип содержимого. Игнорируется только просмотр списка всех страниц моего типа контента. - person Rainell; 09.09.2017
comment
Хорошо, несомненно, это проблема с URL-адресом, во втором тесте, когда я включаю свое приложение в папку мезонина, я добавил свои URL-адреса url(r'^ingredients/', include("mezzanine.ingredients.urls")), в шаблон URL-адресов mezzanine/urls.py, и это сработало. - person Rainell; 10.09.2017

Хорошо, решение было определить URL-адреса моего приложения перед любым другим определением в файле urls.py моего проекта.

имя_проекта/имя_проекта/urls.py

# Add the urlpatterns for any custom Django applications here.
# You can also change the ``home`` view to add your own functionality
# to the project's homepage.

urlpatterns = [
    url(r'^ingredients/', include("apps.ingredients.urls")),
]

urlpatterns += i18n_patterns(
    # Change the admin prefix here to use an alternate URL for the
    # admin interface, which would be marginally more secure.
    url("^admin/", include(admin.site.urls)),
)
person Rainell    schedule 10.09.2017