如何在 django 管理站点中编辑下拉列表



所以我有三个类,如下所示。当我输入 table4 的数据时,当我输入主题名称时,我只希望所选主题的问题出现在问题字段的下拉列表中。有什么办法可以做到这一点吗?另外,在我的 admin.py 中,我只注册了表。

class table5(models.Model):
    topic_name=models.CharField(max_length=222,primary_key=True)
    def __str__(self):
        return self.topic_name

class table3(models.Model):
    id1=models.IntegerField(default=0)
    topic=models.ForeignKey(table5, related_name='topic1',on_delete=models.CASCADE)
    question=models.CharField(max_length=222,primary_key=True)
    answer=models.CharField(max_length=222)
    def __str__(self):
          return self.question
class table4(models.Model):
    username = models.CharField(max_length=222,primary_key=True)
    topic=models.ForeignKey(table5, related_name='topic111',on_delete=models.CASCADE)
    question1=models.ForeignKey(table3, related_name='question3',on_delete=models.CASCADE)
    answer = models.CharField(max_length=222)
    def __str__(self):
       return self.username

您只需要两个覆盖即可执行此操作。

首先创建两个类,并返回要在外键选项中显示的所需文本。

class QuestionChoiceField(forms.ModelChoiceField):
     def label_from_instance(self, obj):
         return "Question: {}".format(obj.question)
class TopicChoiceField(forms.ModelChoiceField):
     def label_from_instance(self, obj):
         return "Topic: {}".format(obj.topic)

现在在以下模型的管理员中添加以下功能。


class QuestionAnswerAdmin(admin.ModelAdmin):

    def formfield_for_foreignkey(self, db_field, request, **kwargs):
       if db_field.name == 'question':
          return QuestionChoiceField(queryset=Table3.objects.all())
       if db_field.name == 'topic':
          return TopicChoiceField(queryset=Table3.objects.all())
    return super().formfield_for_foreignkey(db_field, request, **kwargs)
admin.site.register(table4, QuestionAnswerAdmin)

最新更新