django, использующий объект внутри шаблонов без использования представления

#python-3.x #django

#python-3.x #django

Вопрос:

Я новичок в django; Я использую include внутри шаблона, который вызывает другой шаблон, подобный этому

 {% include "cars_models.html" with user_id=request.user.id %}
  

есть ли способ использовать Cars.objects.get(user_id=request.user.id) или что-то подобное внутри шаблона cars_models напрямую, чтобы получить все автомобили, связанные с идентификатором пользователя, без использования представлений

Я пытаюсь использовать шаблоны cars_models внутри других шаблонов, таких как виджеты для базового шаблона. Я не использую какое-либо представление для своего базового шаблона

Комментарии:

1. Затем вы можете попробовать использовать тег шаблона.

2. @AndreyBorzenko Я не понимаю

3. Если вы не можете использовать представления, но все же хотите выполнить код python для шаблона, вы можете создать свой пользовательский тег шаблона: docs.djangoproject.com/en/3.1/howto/custom-template-tags .

4. @Melvyn — это не то, что я ищу, я пытаюсь использовать шаблоны автомобилей внутри других шаблонов, таких как виджет, чтобы не создавать другое представление, которое возвращает мне автомобили

5. @Melvyn У меня нет представления для базового шаблона

Ответ №1:

Пожалуйста, рассмотрите это решение для пользовательских тегов шаблонов:

  1. В корневом каталоге создайте каталог «templatetags». Создать файл car_tags.py внутри папки добавьте этот код в этот файл:
 from django import template
register = template.Library()

from app_name.models import Car
@register.simple_tag
def car_tag(id):
    return Cars.objects.get(user_id=id)
  
  1. Добавьте библиотеку с вашим тегом в settings.py в ШАБЛОНЫ / ПАРАМЕТРЫ:
         'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
            'libraries': {
                'car_tags': 'templatetags.car_tags',
            }
        },
  
  1. В вашем шаблоне загрузите свой тег в верхней части шаблона: {% load car_tags %}
  2. Используйте свой тег в своем шаблоне таким образом: {% car_tag request.user.id %}

Комментарии:

1. Я получаю эту ошибку django.core.exceptions.ImproperlyConfigured: Unknown parameters: libraries

2. Я обнаружил, что ошибка отсутствовала в шаблоне импорта django

3. Я сделал именно то, что вы сказали, я получаю эту ошибку Invalid block tag on line 4: 'car_tag'. Did you forget to register or load this tag? . Я пытался изменить {{ car_tag request.user.id }} , но я получаю Could not parse the remainder: ' request.user.id' from 'car_tag request.user.id'

4. Пожалуйста, покажите, как вы используете {% load car_tags %} в верхней части вашего шаблона.

5. Пожалуйста, используйте тег таким образом {% car_tag request.user.id %}, это правильно. Похоже, загрузка неправильная.

Ответ №2:

Нет, вы не можете использовать наборы запросов в шаблонах. Вам нужно создать его в своих представлениях и передать в качестве контекста вашим шаблонам.

Но если ваши модели — это что-то вроде этого:

 class Car(models.Model):
    user = models.ForeignKey(User)
  

Вы можете вызвать все машины, связанные с зарегистрированным пользователем в ваших шаблонах, с помощью:

 {% for car in request.user.car_set.all %}
    <p>{{car}}</p>
{%endfor%}
  

Где car_set — это связанный менеджер вашей модели.

Комментарии:

1. Не вижу, что вы хотите. Я не использую никаких представлений. Вы можете использовать car_set.all внутри cars_models.

2. извините, я не очень хорошо понял ваш ответ, но то, что я пытаюсь сделать, это использовать шаблон, подобный виджету, внутри базового шаблона, и я не использую какое-либо представление для своего базового шаблона