Как связать файл CSS с pdf.html файл для Django, исправляющий ошибку FileNotFoundError

#python #html #css #django

#питон #HTML #css — код #django #python #css

Вопрос:

Мой PDF.html не ссылается ни на какой CSS-файл, я попробовал следующее:

Шаблон PDF.HTML

 {% load static %}

<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="UTF-8">
<link href='{% static "css/bootstrap.min.css" %}' rel="stylesheet">
<!-- Material Design Bootstrap -->
<link href='{% static "css/mdb.min.css" %}' rel="stylesheet">
<!-- Your custom styles (optional) -->
<link href='{% static "css/style.min.css" %}' rel="stylesheet">
  

Я использую те же файлы CSS для других шаблонов, что и base.html который работает нормально и связывается с ними, но для этого конкретного HTML он не связывается, поэтому я пытаюсь найти причину этой проблемы

Вот это самое base.html

 {% load static %}

<!DOCTYPE html>
<html lang="en">

<head>
-----------------------------------------------------

<link href='{% static "css/bootstrap.min.css" %}' rel="stylesheet">
<!-- Material Design Bootstrap -->
<link href='{% static "css/mdb.min.css" %}' rel="stylesheet">
<!-- Your custom styles (optional) -->
<link href='{% static "css/style.min.css" %}' rel="stylesheet">
  

Я использую weazyprint для получения pdf, поэтому вот просмотры, которые я пытался использовать, но он возвращается FileNotFoundError at /admin/order/50/pdf/ [Errno 2] No such file or directory: 'C:\Users\User\Desktop\static_rootcss/pdf.css'

 @staff_member_required
def admin_order_pdf(request, order_id):
    order = get_object_or_404(Order,ordered=True, id=order_id)
    html = render_to_string('pdf.html', {'order': order})
    response = HttpResponse(content_type='application/pdf')
    response['Content-Disposition'] = f'filename="order_{order.id}.pdf"'    
    weasyprint.HTML(string=html).write_pdf(response, 
                    stylesheets=[weasyprint.CSS(settings.STATIC_ROOT   'css/pdf.css')])
    return response
  

Я использую следующую конфигурацию в settings.py

 # Static files (CSS, JavaScript, Images)

STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static_in_env')]
VENV_PATH = os.path.dirname(BASE_DIR)
STATIC_ROOT = os.path.join(VENV_PATH, 'static_root')
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
  

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

1. Вы расширили base.html in pdf.html ?

2. @BiploveLamichhane Я не пытаюсь расширить его до Base.html и я пытаюсь связать его только с CSS-файлом. В качестве теста я фактически расширил его до Base, и он работал, показывал навигационные панели и другие вещи, но это PDF-файл, поэтому я пытаюсь добавить только CSS в этот html

3. Можете ли вы попробовать перезагрузить страницу, нажав: ctrl F5 чтобы проверить, не проблема ли это с кешем.

4. @BiploveLamichhane я делал это несколько раз, никакого эффекта

5. @BiploveLamichhane Я добавил еще немного информации

Ответ №1:

Попробуйте:

 weasyprint.HTML(string=html).write_pdf(response, 
                    stylesheets=[weasyprint.CSS(settings.STATIC_ROOT   '/css/pdf.css')])  

Редактировать

Похоже settings.STATIC_ROOT , что он не указывал на правильный путь. Итак, добавление правильного пути, т.е. STATICFILES_DIRS Будет работать. Итак:

 @staff_member_required
def admin_order_pdf(request, order_id):
    order = get_object_or_404(Order,ordered=True, id=order_id)
    html = render_to_string('pdf.html', {'order': order})
    response = HttpResponse(content_type='application/pdf')
    response['Content-Disposition'] = f'filename="order_{order.id}.pdf"'    
    weasyprint.HTML(string=html).write_pdf(response, 
                    stylesheets=[weasyprint.CSS(settings.STATICFILES_DIRS[0]  '/css/pdf.css')])
    return response  

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

1. [Ошибка 2] Нет такого файла или каталога: ‘C:\Users\User\Desktop\static_root/css/pdf.css ‘

2. Есть ли static_root папка непосредственно внутри Desktop ?

3. Нет, я не знаю, почему он ищет там

4. Какова тогда структура каталогов??

5. Я добавил это в сообщение