2017-02-18 8 views
0

djangoを初めて使用しています。私は、さまざまなクラスや課題の学生の成績を把握するのに役立つ教師用ユーティリティのWebサイトを作っています。現在、私は1つのクラスのページを作成しており、テーブルに情報を表示しています。ここでは、学生は行で、各割り当ては列です。djangoフォームを使用して複数の異なるオブジェクトに値を割り当てる方法

メインのクラスページと同じフォーマットで各課題の学生の成績を変更できる「編集」ページを作りたいと思います。そのため、テーブルの各セルのグレードの代わりに、ページの下部に保存ボタンがある入力フィールドがあります。そして私はそれを達成する方法がわかりません。フォームを作成して、特定の生徒/割り当てペアに値を割り当てる方法はありますか?そして、どのように私は各学生/割り当てのペアのそれらのフォームの複数を持つことができますか?私は(不成功に)formsetsを使用してみましたが、私はあまり進歩を遂げることができませんでした。ここで

は私のモデルは、ここで

class Student(models.Model): 
    name = models.CharField(max_length=40) 
    section = models.ForeignKey(Section, blank=False, on_delete=models.PROTECT) 
    subjects = models.ManyToManyField(Subject) 

    def __str__(self): 
     return self.name 

class Assignment(models.Model): 

    section = models.ForeignKey(Section, blank=False, on_delete=models.PROTECT) 
    subject = models.ForeignKey(Subject, blank=False, on_delete=models.PROTECT) 
    assign_date = models.DateField('date assigned', primary_key=True) 
    def __str__(self): 
     return self.assign_date.strftime('%d/%m/%y') 
    class Meta: 
     unique_together = ('section', 'assign_date') 

class AssignmentScore(models.Model): 
    student = models.ForeignKey(Student, blank=False, on_delete=models.PROTECT) 
    assignment = models.ForeignKey(Assignment, blank=False, on_delete=models.PROTECT) 
    assignment_score = models.PositiveIntegerField(validators=[MaxValueValidator(5)], blank=False) 
    class_assignment_score = models.PositiveIntegerField(validators=[MaxValueValidator(5)], blank=False) 
    def __str__(self): 
     return str(self.assignment_score) 
    class Meta: 
     unique_together = ('student', 'assignment') 

フォーム

class GradeForm(forms.ModelForm): 
    # def __init__(self, *args, **kwargs): 
    #  super(GradeForm, self).__init__(*args, **kwargs) 
    #  self.fields['assignment_score'].widget.attrs['style'] = "width:50px" 
    class Meta: 
     model = AssignmentScore 
     fields = ('assignment_score', 'class_assignment_score') 
     widgets = { 
      'assignment_score': forms.TextInput(attrs={'size':1}), 
      'class_assignment_score': forms.TextInput(attrs={'size':1}) 
     } 
     labels = { 
      'assignment_score': '', 
      'class_assignment_score': '', 
     } 

での私の試みであり、ここでHTML Imは、クラスのページに用

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
    <html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
    <title>Untitled Document</title> 
    {% load static %} 
    <link rel="stylesheet" type="text/css" href="{% static 'gradebook/style.css' %}" /> 
    </head> 

<body> 
    <form action='.' method='POST'> 
     {% csrf_token %} 
     {{ form }} 
    </form> 
<table cellpadding="0" cellspacing="0"> 
    <tr> 
     <td> 
     {% if assignments %} 
      {% for assignment in assignments %} 
       <td colspan="2">{{assignment}}</td> 
      {% endfor %} 
     {% endif %} 
     </td> 
    </tr> 
    <tr> 
     <td>&nbsp;</td> 
     {% if assignments %} 
      {% for assignment in assignments %} 
       <td>д.р.</td> 
       <td>к.р.</td> 
      {% endfor %} 
     {% endif %} 

    </tr> 
    {% if students %} 
    <form actions='.' method='POST'> 
     {% csrf_token %} 
     {% for student in students %} 
      <tr> 
       <td>{{student.name}}</td> 

       {% for s in assignment_scores %} 
        {% if s.student.name == student.name %} 
         <td> {{ s.assignment_score }} </td> 
         <td> {{ s.class_assignment_score }} </td> 
        {%endif%} 
       {% endfor %} 
      </tr> 
     {% endfor %} 
     <button type="submit" class="save btn btn-default">Save</button> 

    </form> 

    {% else %} 
     <p> No students </p> 
    {% endif %} 
</table> 
</body> 
</html> 

感謝を生成するために使用されていますヘルプ

+0

なぜあなたはジャンゴのフォームでそれをしたいですか? ...私は可愛らしくないと信じていませんが、あなたは伝統的に作ることができます。つまり、手動で入力フィールドを使うことです。 –

答えて

0

それは確かに可能です。しかし、フォームクリーンメソッドで手動で行う必要があります。参照:https://docs.djangoproject.com/en/1.10/ref/forms/validation/#validating-fields-with-clean

特定の値のPOSTデータは、値のリストにすることができます。したがって、フロントエンドのPOSTリストに[[<student_id>, <assignment_id>, <assignment_score>, <class_assignment_score>] ... ]のリストがある場合は、クリーンメソッドでこれらの値を実際のAssignmentScoreモデルに戻すことができます。

これを行う最善の方法は、これはDjango Formsによって直接サポートされていません。しかし、私は確かに過去に似たようなことをしてきました。

+0

私はこれを初めて使っています。あなたは値のリストをPOSTに設定する方法を詳しく教えてください。フォームなしでこれを行うより良い方法がありますか? – free25zer

+0

html側では、複数の異なる入力に同じ「名前」値を使用するのと同じくらい簡単です。こちらをご覧ください:http://stackoverflow.com/questions/7880619/multiple-inputs-with-same-name-through-post-in-phpしたがって、すべての代入入力に「名前」の「代入」があった場合、Python側では 'requests.POST.getlist( 'assignment')によってそれらを取得します。 – aychedee

関連する問題