【问题标题】:Radio buttons in django admindjango admin 中的单选按钮
【发布时间】:2013-08-14 21:10:49
【问题描述】:

我正在 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

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

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

【问题讨论】:

  • 您使用的是哪个版本的 Django?我们可以看到你的“admin.py”文件吗?此外,您的 Option 模型的 __unicode__ 方法没有返回有效值。
  • 使用RadioSelect。这就像一个普通的下拉菜单,它只是让您选择保存一个值。

标签: python django django-admin


【解决方案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,
    ]

【讨论】:

    【解决方案2】:

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

    right_answer = models.ForeignKey(Option)
    

    像这样,您不需要布尔值correct。您还可以向此添加一个经理,该经理返回任何应该可选择的选项(您覆盖方法get_queryset(),并且该经理应该在get_qeryset()中有这一行:q.option_set.all() where q is there Question。(没有这个任何选项,虽然它与另一个问题匹配,但可以标记。)

    我不确定第二部分是否行得通,不管它是不是一个好方法,但第一部分是重要的。

    【讨论】:

      【解决方案3】:

      将 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,
          )
      

      您可以在管理区域看到here 一个类似的带有图表的示例

      【讨论】:

        【解决方案4】:
        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,
            )
        

        【讨论】:

          【解决方案5】:

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

          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
          

          之后执行迁移它会解决你的问题。

          更多信息Click here

          【讨论】:

            【解决方案6】:
            options = forms.ChoiceField(choices=GENDER_CHOICES, widget=forms.RadioSelect())
            

            你可以参考上面的代码

            【讨论】:

              猜你喜欢
              • 2010-11-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-11-14
              • 2018-08-28
              • 2019-01-30
              • 1970-01-01
              • 2014-04-18
              相关资源
              最近更新 更多