前提・実現したいこと
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 で勉強した程度です。
あなたの回答
tips
プレビュー