Django TypeError: render () принимает 2 позиционных аргумента, но 3 были заданы? - PullRequest
0 голосов
/ 04 сентября 2018

Я отправляю электронное письмо своим водителям с сайта моего сотрудника, но не могу отправить идентификатор водителя со ссылкой URL. Я получаю ошибку:

join_message = template.render(ctx, request)**
TypeError: render() takes 2 positional arguments but 3 were given**

Мой взгляд:

def rentacar_carapp_approve(request):
    if request.POST:
        try:
            args['driver'] = driver = Driver.objects.get(id=request.POST.get('driver_id'))
            subject = "Please Register Your Car"
            from_email = settings.EMAIL_HOST_USER
            to_email = 'bakrshk@gmail.com'
            if to_email is not None:
                template = Template("""Please hit the link and book a car {{ request.get_host }}{% url 'detail' driver_id=driver_id %}""")
                ctx = Context({'driver_id': driver.id})
                join_message = template.render(ctx, request)
                send_mail(subject=subject, from_email=from_email, recipient_list=[to_email], message=join_message,
                          fail_silently=False)
                print("email sent")
        except Driver.DoesNotExist:
            print("Driver doesn't exists")
        return HttpResponseRedirect('/mega-admin/rentacar/carapp-manager/')

Ответы [ 3 ]

0 голосов
/ 04 сентября 2018

Во-первых, вам нужно удалить request из join_message = template.render(ctx, request) и использовать join_message = template.render(ctx)

см. документы

, затем создайте его правильно:

template = Template("""Please hit the link and book a car {{ booking_link }}""")
ctx = Context({'booking_link': request.build_absolute_uri(reverse('detail', kwargs={'driver_id': driver_id}))})
join_message = template.render(ctx)

build_absolute_uri docs

обратные документы

Я не проверял, но он должен вернуть то, что вы ищете ...

0 голосов
/ 04 сентября 2018

Чтобы передать request в контекст шаблона, вы можете явно включить его в контекст:

template = Template("""Please hit the link and book a car {{ request.get_host }}{% url 'detail' driver_id=driver_id %}""")
ctx = Context({'driver_id': driver.id, 'request': request})
join_message = template.render(ctx, request)

Или вы можете использовать RequestContext (при условии, что у вас включен обработчик контекста запроса.

template = Template("""Please hit the link and book a car {{ request.get_host }}{% url 'detail' driver_id=driver_id %}""")
ctx = RequestContext(request, {'driver_id': driver.id})
join_message = template.render(ctx, request)

Обратите внимание, что создание экземпляров шаблонов из строк необычно (например, template = Template("""...""")). Обычно вы сохраняете шаблон в файл в каталоге шаблонов (например, car_approve.email), а затем используете ярлык render_to_string для визуализации шаблона. Шаблон render_to_string принимает request в качестве аргумента.

from django.template.loader import render_to_string
context = {'driver_id': driver.id}
join_message = render_to_string('car_approve.email', context, request=request)
0 голосов
/ 04 сентября 2018

Вы не должны давать параметр запроса.

https://docs.djangoproject.com/en/2.1/ref/templates/api/#django.template.Template

Чтобы объяснить сообщение об ошибке, вы даете 2 аргумента методу рендеринга, который связан с шаблоном insance. Эта «функция» фактически получает 3 параметра, первый из которых «self» (ваш экземпляр Template).

...