2017-08-15 9 views
0

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を使用して)詳細ビューに自分のフォームの選択から行くことができますか?

+0

はあなた 'urls.py'、すなわち何'教室を表示:random'です。また、何が起こっていますか?あなたは間違い、テンプレートの間違ったリンク、他に何かを得ますか? –

+0

上記を編集してurls.pyを表示します。 AttendCreateViewにAttendFormを送信した後、self.object.idを使用したとき、ClassroomDetailView内のid#はautoincrementになります。つまり.../45/then/46 /などです。私はClassroomDetailViewのprint文を使ってself.kwargs ['pk']を印刷し、 "none"を出力します。エラーはありません。 –

+0

さて、今私はあなたがしたいことを理解しました。実際には[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)。 –

答えて

0

あなたはCREATEVIEWを使用する場合、作成されるオブジェクトであるself.objectへのアクセスを、持っているドキュメント

object¶

によって

def get_success_url(self): 
    return reverse('classroom:random', self.object.id) 

を試し、オブジェクトIDが必要です。オブジェクトがまだ作成されていない場合、値はNoneになります。

+0

私はそれを試みました。自動増分だけで、選択したオブジェクトのpkに対応していないようです。それはpkのために与えられなかった。実際にオブジェクトを作成するつもりはないので、私はCreateViewの使用に間違いがあるかもしれません。私はAttendFormを使って1つを選択したいだけです。 –

関連する問題