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