ClassroomCreateView
を使用してクラスルームを選択しています。 ClassroomDetailView
を使って選択した教室を表示したい。これにより、その教室の生徒のリストが表示されます。 ModelFormからDetailViewまでpkとtraverseを使用できるはずです。ModelFormからDetailViewにpkを渡すには?
教室モデル
class Classroom(models.Model):
BLOCK_NUMBER = (
('11', 'Block 1-1'),
('12', 'Block 1-2'),
('13', 'Block 1-3'),
('14', 'Block 1-4'),
('21', 'Block 2-1'),
('22', 'Block 2-2'),
('23', 'Block 2-3'),
('24', 'Block 2-4'),
)
class_list = models.TextField()
course_block = models.CharField(max_length=10, choices=BLOCK_NUMBER)
def __str__(self):
return self.get_course_block_display()
def save(self, *args, **kwargs):
super(Classroom, self).save(*args, **kwargs)
# overrides the default save function to parse the class list
studentList = []
studentList = self.class_list.split('\n')
print (studentList)
for line in studentList:
line = line.strip('\r')
s = Student.objects.create(nickname = line, classroom = self)
学生モデル
class Student(models.Model):
classroom = models.ForeignKey(Classroom, on_delete=models.CASCADE)
nickname = models.CharField(default='JohnS', max_length=31)
Forms.py
class AttendForm(ModelForm):
class Meta:
model = Classroom
fields = ['course_block']
def __init__(self, *args, **kwargs):
super(AttendForm, self).__init__(*args, **kwargs)
Views.py
class AttendCreateView(CreateView):
model = Classroom
form_class = AttendForm
template_name = 'classroom/attend_form.html'
def get_success_url(self):
return reverse('classroom:random', self.kwargs['pk'])
create_attendance_view = AttendCreateView.as_view()
これは私が思っていない部分です。 course_block
にはpkがありますが、フォームからフォームに渡していません。
class ClassroomDetailView(DetailView):
model = Classroom
template_name = 'classroom/random_list.html'
def get_context_data(self, **kwargs):
class_pk = self.kwargs['pk']
context = super(ClassroomDetailView, self).get_context_data(**kwargs)
students = Student.objects.filter(pk = 'class_pk')
context['students'] = students
return context
detail_classroom_view = ClassroomDetailView.as_view()
urls.py
url(r'^classup/$', create_classroom_view, name='classroom'),
url(r'^attend/$', create_attendance_view, name='students'),
url(r'^(?P<pk>[0-9]+)/$', detail_classroom_view, name='random'),
は、どのように私は(おそらく選択肢のPKを使用して)詳細ビューに自分のフォームの選択から行くことができますか?
はあなた 'urls.py'、すなわち何'教室を表示:random'です。また、何が起こっていますか?あなたは間違い、テンプレートの間違ったリンク、他に何かを得ますか? –
上記を編集してurls.pyを表示します。 AttendCreateViewにAttendFormを送信した後、self.object.idを使用したとき、ClassroomDetailView内のid#はautoincrementになります。つまり.../45/then/46 /などです。私はClassroomDetailViewのprint文を使ってself.kwargs ['pk']を印刷し、 "none"を出力します。エラーはありません。 –
さて、今私はあなたがしたいことを理解しました。実際には[Stack Overflowに関する以前の質問](https://stackoverflow.com/questions/45699023/displaying-other-attribute-values-if-one-is-known-in-django-template/45699325)と非常によく似ています)、彼女は 'CreateView'を使用しようとしているところで関数ベースのビュー(' index')を使っていました。私は答えにあなたのコメントに同意します。もし私が[FormView](https://docs.djangoproject.com/ja/1.11/ref/class- views /ジェネリック編集/#formview)。 –