2017-02-18 3 views
0

Ich bin neu bei Django. Ich mache eine Lehrer-Website, die hilft, die Noten der Schüler für verschiedene Klassen und Aufgaben zu verfolgen. Zur Zeit habe ich eine Seite für eine Klasse erstellt und zeige die Informationen in einer Tabelle an, in der die Schüler die Zeilen sind und jede Aufgabe die Spalte ist.Wie kann ich Django-Formulare verwenden, um Werte mehreren verschiedenen Objekten zuzuweisen

Ich möchte eine "Edit" -Seite erstellen, auf der ich die Noten der Schüler für jede Aufgabe im selben Format wie die Hauptklassenseite ändern kann. Damit anstelle der Noten in jeder 'Zelle' der Tabelle ein Eingabefeld mit einer Speicherschaltfläche am unteren Seitenrand erscheint. Und ich bin mir nicht sicher, wie ich das erreichen soll. Wie kann ich einem Formular einen Wert zuweisen, der einem bestimmten Schüler-/Zuweisungspaar entspricht? Und wie kann ich mehrere dieser Formulare für jedes Schüler-/Zuweisungspaar haben? Ich habe versucht, Formsets zu verwenden (erfolglos), aber ich konnte damit nicht viel erreichen.

Hier sind meine Modelle

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') 

Hier mein Versuch ist in einer Form

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': '', 
     } 

und hier ist der html Im mit der Klasse Seite für

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

Dank zu erzeugen die Hilfe

+0

Warum willst du es mit Django-Formen machen? ... ich glaube nicht, möglich, aber Sie können tradicionally machen, ich meine, mit Input-Felder manuell –

Antwort

0

Es ist sicherlich möglich. Aber Sie müssten es manuell in der Forms-Clean-Methode tun. Siehe: https://docs.djangoproject.com/en/1.10/ref/forms/validation/#validating-fields-with-clean.

POST-Daten für einen bestimmten Wert können eine Liste von Werten sein. Wenn Sie also das Frontend POST eine Liste von Listen [[<student_id>, <assignment_id>, <assignment_score>, <class_assignment_score>] ... ] hatten, dann könnten Sie diese Werte in Ihrer Methode clean in die tatsächlichen AssignmentScore-Modelle konvertieren.

Ob dies der beste Weg ist, dies zu tun? Es wird nicht direkt von Django Forms unterstützt. Aber ich habe in der Vergangenheit schon etwas Ähnliches gemacht.

+0

Sorry, ich bin neu hier, können Sie bitte erläutern, wie ich POST eine Liste von Werten einrichten würde. Und vielleicht gibt es einen besseren Weg, dies ohne Formulare zu tun? – free25zer

+0

Auf der HTML-Seite ist es so einfach wie die Verwendung desselben "Name" -Wertes für mehrere verschiedene Eingaben. Siehe hier: http://stackoverflow.com/questions/7880619/multiple-inputs-with-same-name- through-post-in-php. Wenn also alle Zuweisungseingaben den "Namen" "Zuweisung" hätten, würden sie auf der Python-Seite über 'requests.POST.getlist ('Zuweisung') 'abgerufen werden – aychedee

Verwandte Themen