Last update on .

这个需求是在Django Admin后台管理数据的时候出现的...

一、需求

这个需求是在Django Admin后台管理数据的时候出现的,我的数据结构是这样的:

试卷   >  试卷章节  >  试题

其中试题中存储试卷章节的ID, 试卷章节中存储着试卷的ID

在Django Admin中管理试题的时候,默认是显示所有的试卷的试题,浏览很不方便;于是想加一个搜索功能,通过输入试卷名称,只显示这个试卷下的所有试题。

二、数据结构代码展示

上代码,之前说的数据结构的类关系是这样的:

class ExamPaper(models.Model):
    name = models.CharField(verbose_name=u'试卷名称', max_length=100)    
class ExamPaperSection(models.Model):
    name = models.CharField(verbose_name=u'章节名称', max_length=100)
    paper = models.ForeignKey(ExamPaper, verbose_name='所属试卷', related_name='paper_section')
class ExamPaperQuestion(models.Model):
    name = models.CharField(verbose_name=u'试题名称', max_length=100)
    paper_section = models.ForeignKey(ExamPaperSection, verbose_name='所属章节',related_name='section_question')

三、开始作业

第一步

在试题的所属章节和所属试卷在Admin中显示出来,增加两个字段label_paper,label_paper_section。

class ExamPaperQuestion(models.Model):
    …    
    def label_paper(self):
        return self.paper_section.paper    
    def label_paper_section(self):
        return self.paper_section.name

在list_display中添加显示字段

class ExamPaperQuestionAdmin(admin.ModelAdmin):
    …
    list_display = ('name', 'label_paper', 'label_paper_section',)
第二步

在Admin中启用搜索功能

class ExamPaperQuestionAdmin(admin.ModelAdmin):
    …
    search_fields=['paper_section__paper__name',]

敲黑板:papersection代表ExamPaperQuestion中的字段,然后paper_section是外键,搜索的时候并不知道具体要搜索什么,所以需要__(注意是两个下划线)引入具体的字段,是ExamPaperSection中的paper字段,同理paper也是外键,__引入搜索name。

四、看看效果

效果图:

评论

No comments yet.

Please log in by using LinkedIn Weibo to leave a comment.