2017-02-18 23 views
0

我是django的新手。我正在建立一個教師實用網站,以幫助跟蹤不同班級和作業的學生成績。目前,我爲一個班級製作了一個頁面,並將信息顯示在一個表格中,學生是行,每個任務是列。如何使用django表單將值分配給多個不同的對象

我想創建一個'編輯'頁面,我可以修改學生的每個作業的成績,格式與主要課程頁面相同。因此,不是表中每個「單元格」中的成績,都會有一個輸入字段,在頁面底部有一個保存按鈕。我不知道如何實現這一點。我怎樣才能讓表格爲特定的學生/作業對分配一個值?我怎樣才能爲每個學生/任務配對使用多種形式?我嘗試使用(不成功)使用formset,但我無法取得很大進展。

這裏是我的模型

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即時通訊使用生成類頁

<!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

爲什麼你想讓它與Django的形式? ...我不相信posible,但你可以用tradicionally,我的意思是,手動輸入的字段 –

回答

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

相關問題