質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

3783閲覧

django viewsで<int:pk>の取得方法

Mamiya_tom

総合スコア17

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/09/27 01:28

前提・実現したいこと

こちらのサイトでPDF出力を実装しています。
サイトでは、登録されてある全てをPDF出力していますが、一つずつPDF出力を行いたいです。

id_array = list(Work.objects.all().values_list('pk', flat=True))全て取得
↓変更後
id_array = list(Work.objects.filter(pk=1).values_list('pk', flat=True))
変更後のコードだと一つだけPDF化ができました。
の部分を変数(works/<int:pk>/)にするにはどうすれば良いでしょうか?

該当のソースコード

python

1from django.urls import path 2from . import views 3 4app_name = 'works' 5 6urlpatterns = [ 7 # トップ画面(一覧画面) 8 path('', views.ListView.as_view(), name='index'), 9 10 # 詳細画面 11 path('works/<int:pk>/', views.DetailView.as_view(), name='detail'), 12 13 # 登録画面 14 path('create/', views.CreateView.as_view(), name='create'), 15 16 # PDF出力 17 path('pdf/', views.BasicPdf.as_view(), name='pdf'), 18]

python

1#views.py 2from reportlab.pdfgen import canvas 3from reportlab.pdfbase.cidfonts import UnicodeCIDFont 4from reportlab.pdfbase import pdfmetrics 5from reportlab.lib.utils import ImageReader 6from reportlab.lib.pagesizes import A4 7from reportlab.lib.pagesizes import portrait 8from reportlab.lib.units import mm 9from reportlab.platypus import Table 10from reportlab.platypus import TableStyle 11from reportlab.lib import colors 12from django.http import HttpResponse 13class BasicPdf(generic.View): 14 filename = 'photo_work.pdf' # 出力ファイル名 15 title = 'title: Art Works' 16 font_name = 'HeiseiKakuGo-W5' # フォント 17 is_bottomup = True 18 def get(self, request, *args, **kwargs): 19 # PDF出力 20 response = HttpResponse(status=200, content_type='application/pdf') 21 # response['Content-Disposition'] = 'attachment; filename="{}"'.format(self.filename) # ダウンロードする場合 22 response['Content-Disposition'] = 'filename="{}"'.format(self.filename) # 画面に表示する場合 23 # A4縦書きのpdfを作る 24 size = portrait(A4) 25 # pdfを描く場所を作成:位置を決める原点は左上にする(bottomup) 26 # デフォルトの原点は左下 27 p = canvas.Canvas(response, pagesize=size, bottomup=self.is_bottomup) 28 pdfmetrics.registerFont(UnicodeCIDFont(self.font_name)) 29 p.setFont(self.font_name, 16) # フォントを設定 30 # pdfのタイトルを設定 31 p.setTitle(self.title) 32 # 全ての作品情報を出力する。(検索結果は無関係) 33 id_array = list(Work.objects.filter(pk=1).values_list('pk', flat=True)) 34 for work_count, work_id in enumerate(id_array): 35 logger.debug(work_count) 36 if Image.objects.filter(work_id=work_id).exists(): # 画像が紐づく場合 37 # 作品に紐づく画像パスを取得 38 image = Image.objects.values_list('image', flat=True).get(work_id=work_id) 39 else: 40 # No Imageパス 41 image = settings.MEDIA_URL + NO_IMAGE 42 # 作品情報 43 workInfo = Work.objects.filter(pk=work_id).first() 44 # 表の情報 45 data = [ 46 ['タイトル', workInfo.title, 'メモ', workInfo.memo], 47 ] 48 table = Table(data, (15 * mm, 50 * mm, 12 * mm, 50 * mm), None, hAlign='CENTER') 49 # TableStyleを使って、Tableの装飾をします。 50 table.setStyle(TableStyle([ 51 # 表で使うフォントとそのサイズを設定 52 ('FONT', (0, 0), (-1, -1), self.font_name, 9), 53 # 四角に罫線を引いて、0.5の太さで、色は黒 54 ('BOX', (0, 0), (-1, -1), 1, colors.black), 55 # 四角の内側に格子状の罫線を引いて、0.25の太さで、色は黒 56 ('INNERGRID', (0, 0), (-1, -1), 0.25, colors.black), 57 # セルの縦文字位置 58 ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'), 59 ("ALIGN", (0, 0), (-1, -1), "CENTER"), 60 ('TEXTCOLOR', (0, 0), (0, 0), colors.darkblue), 61 ('TEXTCOLOR', (2, 0), (2, 0), colors.darkblue), 62 ])) 63 if work_count % 2 == 0: # 偶数の場合 64 # 画像の描画 65 p.drawImage(ImageReader(image[1:]), 10, 530, width=580, height=280, mask='auto', 66 preserveAspectRatio=True) 67 # tableを描き出す位置を指定 68 table.wrapOn(p, 50 * mm, 50 * mm) 69 table.drawOn(p, 43 * mm, 160 * mm) 70 else: # 奇数の場合 71 # 画像の描画 72 p.drawImage(ImageReader(image[1:]), 10, 130, width=580, height=280, mask='auto', 73 preserveAspectRatio=True) 74 # tableを描き出す位置を指定 75 table.wrapOn(p, 50 * mm, 50 * mm) 76 table.drawOn(p, 43 * mm, 19 * mm) 77 p.showPage() # Canvasに書き込み(改ページ) 78 if len(id_array) % 2 != 0: # 出力作品数が奇数の場合 79 p.showPage() # Canvasに書き込み 80 p.save() # ファイル保存 81 self._draw(p) 82 return response 83 def _draw(self, p): 84 pass

必要なものがあれば追記したしますのでよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

クラスベースの場合

urls.pyで定義した内容は、Viewオブジェクトのプロパティkwargsに格納されるようになっています。

python

1class BasicPdf(generic.View): 2 def get(self, request, *args, **kwargs): 3 ## 略 4 id_array = list(Work.objects.filter(pk=self.kwargs["pk"]).values_list('pk', flat=True)) 5

Djangoドキュメントでの利用例

おまけ:関数ベースの場合

関数ベースのviewにURLからのパラメータを渡したい場合は、関数の引数として定義してあげるだけで良いです。(クラスベースViewの中身も、この挙動を振り替えている感じです)

### urls.py urlpatterns = [ path('articles/<int:year>/', views.year_archive), ] ### views.py def year_archive(request, year): ...

==>参照先

投稿2020/09/27 06:23

attakei

総合スコア2740

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Mamiya_tom

2020/09/27 08:48

サイトまで教えていただきありがとうございます! わかりやすかったです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問