/ Форматування таблиць формату Django - django

Формат таблиць формату Django - django

Я будую шаблон результатів тесту для студентів, алея маю проблему В даний час я створив 2 тести (математика та орфографія) в моїй моделі тестів. Проблема полягає в тому, що якщо я ввожу дані (оцінки) для другого тесту (орфографії) для студента, спочатку оцінка неправильно розміщується в шаблоні - оцінка потрапляє в стовпець Maths, а не в стовпець Орфографія. Це виправляється / переміщується в колонку правопису, як тільки я ввожу одне ім'я студента в тест Maths. Це незначна проблема, але результат все ще знаходиться в неправильному місці, і я не знаю чому.

Я повинен робити щось не так. Я упускаю якийсь фільтр, я думаю. Сподіваємося, що наведений нижче код допоможе пояснити це далі. Дякую.

    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]

Відповіді:

0 для відповіді № 1

Проблема полягає в тому, що потрібно якось замовити item.art.all() в тому ж порядку, що і зі стовпцями таблиці (тобто. математичні номери, а потім написання). Також потрібно розглянути випадки, коли додається тільки один з результатів тесту. Але немає прямих шляхів досягнення цього, ви не можете мати сторонний ключ (або відносини) для ordering в Meta клас

Таким чином, у вас може бути метод Display модель, щоб повернути список у бажаному порядку та називати його з шаблону.

Приклад рішення нижче:

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

Отже, що ви можете зробити у шаблоні

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