/ / Django Vorlagenformatierung - Django

Django Vorlage Tabellenformatierung - Django

Ich baue eine Student Testergebnisse Vorlage aberhabe ein Problem. Derzeit habe ich zwei Tests (Mathe und Rechtschreibung) in meinem Testmodell erstellt. Das Problem ist, wenn die Daten (Bewertungen) für den zweiten Test (Rechtschreibprüfung) für einen Schüler zuerst eingegeben werden, wird der Punktwert falsch in der Vorlage platziert - der Punktestand wird in der Spalte Mathematik und nicht in der Spalte Rechtschreibung platziert. Sobald ich denselben Namen im Mathetest eingegeben habe, wird die Korrektur in die Spalte für die Rechtschreibung verschoben. Es ist ein kleines Problem, aber das Ergebnis ist immer noch an der falschen Stelle und ich weiß nicht warum.

Ich muss etwas falsch machen. Mir fehlt eine Filterung, denke ich. Hoffentlich hilft der folgende Code weiter zu erklären. Vielen Dank.

    class Student(models.Model):
first = models.CharField(max_length=100)
last = models.CharField(max_length=100)
gender = models.CharField(max_length=1)
teacher = models.ForeignKey(Teacher)

def __unicode__(self):
return "%s %s" % (self.first, self.last)


class Test(models.Model):
name = models.CharField(max_length=100)
Out_of = models.IntegerField(null=True, blank=True)

def __unicode__(self):
return self.name

class Meta:
ordering = ["name"]



class Display(models.Model):
name = models.ForeignKey(Student, related_name="art")
test = models.ForeignKey(Test)
one = models.IntegerField(null=True, blank=True)
two = models.IntegerField(null=True, blank=True)
three = models.IntegerField(null=True, blank=True)

# views.py
def test(request):

return list_detail.object_list(
request,
queryset = Student.objects.all(),
template_name = "display.html",
template_object_name = "results",

# display.html

<table>

<tr>
<th>First</th>
<th>Name</th>
<th>Maths</th>
<th>Spelling</th>
</tr>
{% for item in results_list %}

<tr>
<td> {{ item.first }} </td>
<td> {{ item.last }} </td>

{% for x in item.art.all %}
<td> {{ x.one }} </td>

{% endfor %}

{% endfor %}
</tr>

</table>

# admin.py
class StudentInline(admin.TabularInline):
model = Display


class TestAdmin(admin.ModelAdmin):
inlines = [StudentInline]

Antworten:

0 für die Antwort № 1

Das Problem ist, dass du das irgendwie bestellen musst item.art.all() in der gleichen Reihenfolge wie die Ihrer Tabellenspalten (d. h. Mathezahlen und dann die Rechtschreibung). Außerdem müssen Fälle behandelt werden, wenn nur eines der Testergebnisse hinzugefügt wird. Aber es gibt keine direkte Möglichkeit, dies zu erreichen, Sie können kein fremdes Schlüssel- (oder Beziehungs-) Mitglied haben ordering im Meta Klasse.

So kann eine Methode in Ihrem haben Display Modell, um die Liste in der bevorzugten Reihenfolge zurückzugeben und aus der Vorlage aufzurufen.

Beispiellösung unten:

class Student(models.Model):
first = models.CharField(max_length=100)
last = models.CharField(max_length=100)
gender = models.CharField(max_length=1)
teacher = models.ForeignKey(Teacher)
def __unicode__(self):
return "%s %s" % (self.first, self.last)

#this would return in order as math, spelling
def get_result_list_in_order(self):
rlist = []
for tname in ["math", "spelling"]:
rtest = self.art.filter(test__name__iexact=tname)
if rtest:
rlist.append(rtest[0])  #add the first entry from filtered queryset
# or do
#rlist.extend(rtest)
else
rlist.append(None)

return rlist

Also was du in der Vorlage kannst ist

{% for x in item.get_result_list_in_order %}
<td> {{x.one}} </td>
{% endfor %}