我有这些(简化)模型:
class Question(models.Model):
question = models.CharField(max_length=60)
class Choices(models.Model):
question = models.ForeignKey(Question)
text = models.CharField(max_length=60)
is_correct = models.BooleanField(default=False)
我已将选择作为问题的内联(在管理员中)。有没有办法确保只有一个Choice会有is_correct = True?
理想情况下,当is_correct显示在管理表单集(TabularInline)中时,它将显示为单选按钮。
我的admin.py有:
from django.contrib import admin
class OptionInline(admin.TabularInline):
model = Option
extra = 5
max_num = 5
class QuestionAdmin(admin.ModelAdmin):
inlines = [OptionInline, ]
admin.site.register(QType)
admin.site.register(Question, QuestionAdmin)
答案 0 :(得分:1)
我的(不太理想)解决方案是在formset中添加验证,如果选中了多个复选框,则显示验证错误:
将此添加到我的admin.py:
从django.forms.models导入BaseInlineFormSet 来自django.forms.util import ValidationError
从模型导入QType,Question,Option
class OptionFormSet(BaseInlineFormSet):
def clean(self):
if any(self.errors):
return
checked = 0
for i in range(0, self.total_form_count()):
form = self.forms[i]
if not form.cleaned_data.has_key('is_correct'):
continue
correct = form.cleaned_data['is_correct']
if correct:
checked = checked + 1
if (checked>1):
raise ValidationError, "Please select only one correct answer."
我的班级OptionInline成了:
class OptionInline(admin.TabularInline):
model = Option
extra = 5
max_num = 5
formset = OptionFormSet