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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

0回答

1698閲覧

Django でアプリの特定情報にユーザー毎のチェックボックスやコメント欄を設けたい

atsuton

総合スコア12

Django

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/01/15 13:41

編集2019/01/26 15:13

前提・実現したいこと

Django で、文章を暗記するためのアプリを作ろうとしております。
文章自体は、admin の管理画面で登録します。
ユーザーは閲覧するだけですが、文章ごとに、チェックボックス(暗記が済んだ/済んでない)や、
コメントを付けられる欄を設けたいと考えております。
※チェックボックス・コメント欄とも付けた本人のみ閲覧可能、
チェックボックスにチェックがついている文章のみを検索で絞り込んで
一覧にする機能も持たせたいと考えています。

その場合、ユーザーに紐づいた model を作って実装すると思われるのですが、
やり方がわからないため質問させていただきました。

H31.1.20 修正・追記
ユーザーについては、users というアプリを作成しました。
暗記アプリは anki というアプリを作成しています。
anki の中の models.py に users と紐づけた
StudyStatusByUser というmodel を追加し、チェックの状況やコメントを管理しようとしています。

最終的には、ユーザー側でのチェックボックス操作・コメント追加 をしたいのですが、
それ以前に SectionAndContent と StudyStatusByUser のデータを紐づけて、
一覧の表示することができないので、その点の解決方法(データの取得方法など)を教えていただけますとありがたいです。

SQLだと、下記のようになるかと思います。

sql

1SELECT section_title, check_status, comment From SectionAndContent AS SAC Left Outer Join 2StudyStatusByUser AS SSBU ON SSBU.section.id = SAC.id WHERE SSBU.user = request.user

該当のソースコード

python

1models.py 2class Book(models.Model): 3 book_title = models.CharField('タイトル', max_length=100) 4 def __str__(self): 5 return self.book_title 6 7 8class Chapter(models.Model): 9 book = models.ForeignKey(Book, on_delete=models.PROTECT) 10 chapter_number = models.IntegerField(verbose_name='章番号', validators=[MinValueValidator(1), MaxValueValidator(100)], unique=True) 11 chapter_title = models.CharField('タイトル', max_length=100) 12 def __str__(self): 13 return str(self.chapter_number) + ". " + self.chapter_title 14 15 16H31.1.20 追記 17class SectionAndContent(models.Model): 18 RANK_CHOICES = (('A','A'),('B','B'),('C','C'),(' ',' ')) 19 chapter = models.ForeignKey(Chapter, on_delete=models.PROTECT, to_field="chapter_number") 20 section_number = models.IntegerField(verbose_name='節番号', validators=[MinValueValidator(1), MaxValueValidator(100)]) 21 section_title = models.CharField('タイトル', max_length=100) 22 display_order = models.IntegerField(verbose_name='表示順', validators=[MinValueValidator(1), MaxValueValidator(100)]) 23 rank = models.CharField(verbose_name='ランク', max_length=2, choices=RANK_CHOICES, default=' ') 24 content_text = models.TextField(verbose_name='', blank=True, null=True, max_length=5000) 25 26 def __str__(self): 27 return str(self.chapter.id) + "-" + str(self.section_number) + ". " + self.section_title 28 29 def my_function(self): 30 return str(self.content_text).splitlines() 31 32# 2019.1.27修正 ※習熟度追加 33class StudyStatusByUser(models.Model): 34 PROFICIENCY_CHOICES = ( 35 (0, ' '), 36 (1, '1'), 37 (2, '2'), 38 (3, '3'), 39 ) 40 user = models.ForeignKey('users.User', on_delete=models.CASCADE) 41 section = models.ForeignKey(SectionAndContent, on_delete=models.CASCADE) 42 check_status = models.BooleanField(default=False) 43 proficiency = models.IntegerField(verbose_name='習熟度', blank=True, null=True, default=0, choices=PROFICIENCY_CHOICES) 44 comment = models.CharField(max_length=255,default='', blank=True) 45 46 class Meta: 47 unique_together = ('user', 'section') 48 49 def __str__(self): 50 return str(self.section) 51 52 53views.py ※一部 54def chapter_and_section_list(request, pk): 55 chapter = get_object_or_404(Chapter, pk=pk) 56 return render(request, 'anki/chapter_and_section_list.html', {'chapter': chapter}) 57 58# 2019.1.27追加 59from django.db.models import Q 60def study_status_by_user(request, pk): 61 status = SectionAndContent.objects.filter(Q(studystatusbyuser__user=request.user) | Q(studystatusbyuser__isnull=True)).values( 62 'studystatusbyuser__check_status', 'studystatusbyuser__comment', 'section_title') 63 return render(request, 'anki/study_status_by_user.html', {'status':status})

下記テンプレートの中に、StudyStatusByUser の check_status と comment を紐づけたいのですが、
"chapter.sectionandcontent_set.all"

"chapter.sectionandcontent_set.all.filter(StudyStatusByUser__user=request.user)"
に変更すると、エラー(Could not parse the remainder)になりました。

html

1chapter_and_section_list.html 2{% block content %} 3 <div class="chapter-title"> 4 <h2>{{ chapter }}</h2> 5 </div> 6 {% for chapter in chapter.sectionandcontent_set.all %} 7 <div class="section-title"> 8 <h1><a href="{% url 'section_and_content' pk=chapter.pk %}"> 9 {{ chapter.chapter.id }}-{{ chapter.section_number }}.{{ chapter.section_title }} 10 </a></h1> 11 </div> 12 {% endfor %} 13{% endblock %} 14

補足情報

・python 3.7.2 を使用しています。
・python, Django は DjangoGirls で勉強した程度です。

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

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

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

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

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

matsuand

2019/01/16 02:20

丸投げの質問と言われそうですよ。実装の話ではなく設計の話です。チェック状態とコメント内容を、どうやったら管理できるか、です。どこまでご自身で考えられて、どこから分からないのか、お示しになるべきと思います。
atsuton

2019/01/17 13:32

ご指摘ありがとうございます。 週末にかけて、いろいろ試してみた後で追記したいと思います。
matsuand

2019/01/20 01:00

論理設計のレベルで誤っているように見受けます。(1)SectionAndContentクラスでは chapter オブジェクトを to_field="chapter_number" とすると、全bookで chapter_number を一意とすることになり不自然、(2) SQL 文は未チェックのものを引っ張ってこれません、(3) エラー箇所は (2) と根本は同じで 未チェックのものを考慮していない作りであるからと想像します。すべて机上デバッグです。間違っていたらごめんなさい。
atsuton

2019/01/20 04:43

ご回答ありがとうございます。 (1)確認します。 (2)(3)SQLでは WHERE を AND にすることで、StudyStatusByUser にデータが無い場合にもデータを引っ張ってこれそうです。Django 上では確認できていないので、試してみます。 ===== ローカル環境にて、sqlite の dbshell で確認できました。 SELECT SAC.section_title, SSBU.check_status, SSBU.comment from anki_sectionandcontent AS SAC Left OUTER JOIN anki_studystatusbyuser AS SSBU ON SSBU.section_id = SAC.id AND SSBU.user_id = 1;
atsuton

2019/01/26 15:49

(1)はまだ検証できていません。(2)(3)については、 views.py に下記を追加して、LEFT OUTER JOIN でデータを取ってくることはできました。 1. from django.db.models import Q 2. study_status_by_user(request, pk): status = SectionAndContent.objects.filter(Q(studystatusbyuser__user=request.user) | Q(studystatusbyuser__isnull=True)).values( 'studystatusbyuser__check_status', 'studystatusbyuser__comment', 'section_title') 管理画面でデータを登録すれば、ユーザー毎のコメントを表示させることはできました。 ユーザー側での登録は実現できていないので、引続き検証する予定です。 もう少し課題を整理して、質問しなおすかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問