Как пометить только один из наборов форм в админке django? - PullRequest
0 голосов
/ 29 марта 2010

У меня есть эти (упрощенные) модели:

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)

Я сделал выбор в виде встроенного вопроса (в админке). Есть ли способ убедиться, что только один вариант будет иметь 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)

1 Ответ

1 голос
/ 29 марта 2010

Мое (не очень идеальное) решение состояло в том, чтобы добавить проверку в набор форм и отобразить ошибку проверки, если установлен более одного флажка:

добавил это в мой admin.py:

из django.forms.models import BaseInlineFormSet из django.forms.util import ValidationError

из моделей импорт QType, вопрос, опция

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
...