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> </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
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 –