如何在django表单中由多个字段生成的CheckboxSelectMultiple ChoiceWidget的单个选项上设置属性?
我有一个django应用程序,有多项选择题和答案。未回答的答案作为布尔字段存储在数据库表中,并呈现为用户回答的表单 当用户回答了多项选择题时,将再次显示带有给定答案的问题,以显示每个单项选择题的答案是否正确 因此,我们需要在每个窗口小部件上设置一个属性,当在表单呈现期间评估模型类的多个相关字段时,默认窗口小部件呈现器会自动生成这些窗口小部件,我们反过来希望在remplate中访问这些字段,以正确设置输出html的样式,从而向用户提供视觉反馈 models.py如何在django表单中由多个字段生成的CheckboxSelectMultiple ChoiceWidget的单个选项上设置属性?,django,Django,我有一个django应用程序,有多项选择题和答案。未回答的答案作为布尔字段存储在数据库表中,并呈现为用户回答的表单 当用户回答了多项选择题时,将再次显示带有给定答案的问题,以显示每个单项选择题的答案是否正确 因此,我们需要在每个窗口小部件上设置一个属性,当在表单呈现期间评估模型类的多个相关字段时,默认窗口小部件呈现器会自动生成这些窗口小部件,我们反过来希望在remplate中访问这些字段,以正确设置输出html的样式,从而向用户提供视觉反馈 models.py from django.db im
from django.db import models
...
class SchulungsEinheitTestergebnis(models.Model):
""" Schattentabelle eines Testergebnisses einer Frage eines Schulungseinheittestes """
id = models.AutoField('ID', primary_key=True, db_column='sete_id')
schulungseinheittest = models.ForeignKey(SchulungsEinheitTest, db_column='set_id', on_delete=models.CASCADE, null=True, default=None, blank=True)
frage = models.ForeignKey(Frage, db_column='frg_id', on_delete=models.SET_NULL, null=True, default=None, blank=True)
antworten = models.ManyToManyField(Antwort, blank=True, help_text='Gegebene Antworten', related_name='set_set',related_query_name='set', verbose_name='Gegebene Antworten (Nur für Fragen mit Mehrfachauswahl)')
def is_richtig(self):
if not self.frage:
return False
richtige_antworten = self.frage.antwort_set.filter(richtig=True)
gegebene_antworten = self.antworten.all()
if not len(gegebene_antworten) == len(richtige_antworten):
return False
not_found = False
for richtige_antwort in richtige_antworten:
if richtige_antwort not in gegebene_antworten:
not_found = True
return not not_found
forms.py
from django import forms
from django.forms.widgets import CheckboxSelectMultiple
class TestErgebnisFormMehrfach(forms.ModelForm):
class Meta:
model = SchulungsEinheitTestergebnis
fields = ('id', 'frage', 'antworten')
widgets = {
'frage': FrageWidget,
'antworten': CheckboxSelectMultiple
}
def __init__(self, *args, **kwargs):
super(TestErgebnisFormMehrfach, self).__init__(*args, **kwargs)
if self.instance:
if self.instance.frage:
self.fields['antworten'].queryset = self.instance.frage.antwort_set.all()
class TestErgebnisFormMehrfachErgebnis(TestErgebnisFormMehrfach):
def __init__(self, *args, **kwargs):
super(TestErgebnisFormMehrfachErgebnis, self).__init__(*args, **kwargs)
self.fields['antworten'].disabled = True
test.html
{% for form in formset %}
<div >
{{ form.id }}
<div class="zustand">
<p class="fragen-nummer">Frage {{ forloop.counter }}</p>
</div>
<div class="inhalt">
<p class="fragetext">{{ form.frage }}</p>
<div class="antworten mehrfach">
{% for radio in form.antworten %}
<div class="antwort">
{{ radio.tag }}
{# here i need access to some information tagged to the "radio", or to the displayed answer instance #}
<label class="knopf" for="{{ radio.id_for_label }}"></label>
<label class="antworttext" for="{{ radio.id_for_label }}">{{ radio.choice_label }}</label>
</div>
{% endfor %}
</div>
</div>
</div>
{% endfor %}
{formset%中表单的%
{{form.id}
Frage{{{forloop.counter}
{{form.frage}
{%用于格式为.antworten%的收音机}
{{radio.tag}
{#这里我需要访问一些标记为“radio”的信息,或者访问显示的应答实例#}
{{radio.choice_label}
{%endfor%}
{%endfor%}
当默认窗口小部件呈现程序找到复选框SelectMultiple窗口小部件时,会自动生成实际的复选框
相应字段附带了一个查询集,仅显示与问题相关的答案
问题是:我是否需要实现我自己的小部件渲染器,或者是否有方法向默认小部件渲染器提供它需要的信息,以便在模板渲染期间使用一些属性标记生成的复选框以访问它?radio.is_correct_在上述模板代码中得到了回答,例如
如何做到这一点?如果用户选择的是对的还是错的,您将信息存储在哪里?我已编辑了问题以显示更多详细信息。无法理解变量和模型名称的含义。我猜他们来自非英语语言。如果我的理解正确,“蚂蚁草”存储用户给出的答案。在“Antwort”中添加一个布尔字段,该字段将记录正确或错误答案的状态。使用模板中的该字段更改CSS属性。模型类“SchulungsEinheitTestergebnis”的多对多字段“antworten”的复选框在呈现表单“TestergebnisFormMehrfach”时由默认小部件呈现器动态生成。查询集仅限于显示与问题相关的答案。我看不到如何将任何实例信息放入通过使用表单类中的多对多字段自动显示的checkbox小部件的呈现过程中。