3

我正在 django 中创建一个测验应用程序。这是模型:

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

每个问题只能有一个答案。这就是问题所在。我无法弄清楚如何为选项模型编写管理表单,以便对于每个问题,只有一个选项可以具有正确=真。

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

4

6 回答 6

1

我不确定如何通过反向查找来完成。

我知道这不是您想要的,但非常接近。你能继续在 admin.py 中试试这个吗

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,
    ]
于 2015-12-24T14:44:09.560 回答
1

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

right_answer = models.ForeignKey(Option)

像这样,你不需要 boolean correct。您还可以向此添加一个经理,该经理返回任何应该可选择的选项(您覆盖方法get_queryset(),并且该经理应该在 get_qeryset() 处有这一行:q.option_set.all()其中 q 存在问题。(没有这个任何选项,尽管它与另一个问题,可以标记。)

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

于 2017-02-09T16:02:18.217 回答
0
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,
    )
于 2018-10-19T12:41:30.990 回答
0
options = forms.ChoiceField(choices=GENDER_CHOICES, widget=forms.RadioSelect())

你可以参考上面的代码

于 2020-10-23T12:25:44.070 回答
0

如果您想在管理面板中选择问题并注册模型,请查看以下代码。

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

    def __unicode__(self):
        return self.question

并在 Option 类中添加您要提供的选择

OPTIONS = (
     (choice1 : 'choice1'),
     (choice2 : 'choice2')
) 
class Option(models.Model):
    question = models.ForeignKey(Question)
    option = models.CharField(max_length=250, choices=OPTIONS)
    correct = models.BooleanField(default=False)

    def __unicode__(self):
        return self.title

之后执行迁移它将解决您的问题。

更多信息请点击这里

于 2019-08-22T13:26:12.910 回答
0

将 RadioSelect 小部件与管理员集成一起使用。

class SimpleAdmin:
    ...
    form SimpleForm
    fields = (..., 'my_option', ...)
    ...

使用额外选项创建表单:

class SimpleForm(forms.ModelForm):
    class Meta:
        model = Simple
    my_option = ChoiceField(
        label = 'Options',
        choices = (
            (0, 'num 0'),
            (1, 'num 1'),
        ),
        initial = 0,
        widget = RadioSelect,
    )

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

于 2018-09-15T17:15:16.947 回答