Как передать значение функции тега пользовательского шаблона Django

#python #django

Вопрос:

Произошла ошибка в моем любимом проекте:

 TemplateSyntaxError at /car/2/ 'get_car_info' did not receive value(s) for the argument(s): 'car_id'  

Как я вижу, функция в тегах пользовательских шаблонов не может получить значение, но журнал Django показывает, что переменная car_id существует:

 Local vars Variable Value car_id 2 context {'spare_parts': lt;QuerySet [lt;Mileage: Рулевой наконечник Sasic 7674007gt;]gt;,  'title': 'Список запчастей для'} request lt;WSGIRequest: GET '/car/2/'gt;  

models.py

 class Car(models.Model): brand = models.CharField(max_length=40, db_index=True, verbose_name="Марка") model_name = models.CharField(max_length=60, db_index=True, verbose_name="Модель") model_variant = models.CharField(max_length=100, db_index=True, verbose_name="Модификация") age = models.SmallIntegerField(verbose_name="Год выпуска")  

views.py (прокомментированный код перемещен в теги пользовательских шаблонов)

 def get_car_spare_parts(request, car_id): spare_parts = Mileage.objects.filter(car_id=car_id) # car = Car.objects.get(id=car_id) context = {  'spare_parts': spare_parts,  'title': 'Список запчастей для',  # 'model_name': car.model_name,  # 'brand': car.brand,  # 'car_age': car.age, } return render(request, 'mileage/car.html', context)  

urls.py

 urlpatterns = [ path('car/lt;int:car_idgt;/', get_car_spare_parts, name='car_spare_parts'),]  

mileage_tags.py

 @register.simple_tag def get_car_info(car_id): car = get_object_or_404(Car, car_id=car_id) return car  

car.html

 {% extends 'base.html' %} {% load mileage_tags %}  {% block head %} lt;titlegt;{{ title }}lt;/titlegt; {% endblock %}  {% block body %} lt;h1gt;{{ title }} {{ brand }} {{ model_name }} {{ car_age }} г./в.lt;/h1gt;  {% get_car_info %}  lt;ol class="list-group list-group-numbered"gt;  {% for item in spare_parts %}  lt;li class="list-group-item"gt;lt;a href="{% url 'spare_parts_mileages' item.car_id item.spare_part_id %}"gt;{{ item }}lt;/agt;lt;/ligt;  {% endfor %}  lt;/olgt; {% endblock %}  

Как это исправить?

Ответ №1:

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

 def get_car_spare_parts(request, car_id):  spare_parts = Mileage.objects.filter(car_id=car_id)  car = Car.objects.get(id=car_id)  context = {  'spare_parts': spare_parts,  'title': 'Список запчастей для',  'car':car  }  return render(request, 'mileage/car.html', context)  

затем в вашем шаблоне

 {% extends 'base.html' %} {% load mileage_tags %}  {% block head %} lt;titlegt;{{ title }}lt;/titlegt; {% endblock %}  {% block body %} lt;h1gt;{{ title }} {{ car.brand }} {{ car.model_name }} {{ car.age }} г./в.lt;/h1gt;  {% get_car_info car.id %}  lt;ol class="list-group list-group-numbered"gt;  {% for item in spare_parts %}  lt;li class="list-group-item"gt;lt;a href="{% url 'spare_parts_mileages' item.car_id item.spare_part_id %}"gt;{{ item }}lt;/agt;lt;/ligt;  {% endfor %}  lt;/olgt; {% endblock %}  

По поводу вашего вопроса вам нужно будет указать идентификатор автомобиля в теге шаблона следующим образом

 {% get_car_info car.id %}