关于Python的Django的admin中的单选按钮

Radio buttons in django admin

我正在Django创建一个测验应用程序。模型如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    class Quiz(models.Model):
        title = models.CharField(max_length=200)
        description = models.TextField()
        publish = models.BooleanField(default=False)

        def __unicode__(self):
            return self.title

    class Question(models.Model):
        quiz = models.ForeignKey(Quiz)
        question = models.TextField()
        hint = models.TextField()

        def __unicode__(self):
            return self.question

    class Option(models.Model):
        question = models.ForeignKey(Question)
        option = models.CharField(max_length=250)
        correct = models.BooleanField(default=False)

        def __unicode__(self):
            return self.title

每个问题只能有一个答案。这就是问题所在。我还没有弄清楚如何为选项模型编写管理表单,这样对于每个问题,只有一个选项的correct=true。

我可以对每个问题使用单选按钮,但不知道如何限制它们,以便只能为一个外键选择一个。


我这样理解您的问题:您希望更改代码,因为只有一个选项是正确的。为什么不在问题中添加这一行:

1
right_answer = models.ForeignKey(Option)

像这样,你不需要布尔型的correct。您还可以在此添加一个管理器,该管理器返回任何可选择的选项(您重写方法get_queryset(),并且此管理器应该在get_qeryset():q.option_set.all()处有此行,其中q是有问题的。(没有这个选项,任何选项,尽管它与另一个问题匹配,但可以被标记。)

我不确定第二部分是否会起作用,也不确定它是否是一个好方法,但第一部分是重要的一部分。


我不知道如何用反向查找来完成。

我知道这不是你想要的,但很接近。你能去行政部试试这个吗?

1
2
3
4
5
6
7
8
9
10
11
admin.site.register(Quiz)
#admin.site.register(Option) #Include this if required

class OptionInline(admin.TabularInline):
    model = Option

@admin.register(Question)
    class QuestionAdmin(admin.ModelAdmin):
    inlines = [
        OptionInline,
    ]


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class FooAdmin:
    form FooForm
    fields = ('gender', .....)

class FooForm(forms.ModelForm):
    class Meta:
        model = Foo
    gender = ChoiceField(
        label = 'Options',
        choices = (
            (0, 'Male'),
            (1, 'Female'),
        ),
        initial = 0,
        widget = RadioSelect,
    )

使用带有管理集成的radioselect小部件。

1
2
3
4
5
class SimpleAdmin:
    ...
    form SimpleForm
    fields = (..., 'my_option', ...)
    ...

使用其他选项创建表单:

1
2
3
4
5
6
7
8
9
10
11
12
class SimpleForm(forms.ModelForm):
    class Meta:
        model = Simple
    my_option = ChoiceField(
        label = 'Options',
        choices = (
            (0, 'num 0'),
            (1, 'num 1'),
        ),
        initial = 0,
        widget = RadioSelect,
    )

您可以在这里看到一个类似的示例,其中包含一个进入管理区域的图表。