2014-05-05 55 views
0

我有一個模型,Challenge_Question:如何爲多種類型的問題創建django管理內聯?

class ChallengeQuestion(models.Model): 
    challenge = models.ForeignKey('Challenge') 
    question = models.CharField(max_length=500) 
    displayed_answers = models.IntegerField() 
    required = models.BooleanField() 
    multiple_choice = 'MC' 
    fill_in_the_blank = 'FB' 
    ordering = 'OR' 
    true_false = 'TF' 
    question_choices = (
     (multiple_choice, 'Multiple Choice'), 
     (fill_in_the_blank, 'Fill In The Blank'), 
     (ordering, 'Ordering'), 
     (true_false, 'True/False'), 
    ) 
    question_type = models.CharField(max_length=2, choices=question_choices, default=multiple_choice, db_index=True) 

對於每個question_type,然後我有一個相關的模型FK到ChallengeQuestion:

class ChallengeQuestionMC(models.Model): #for multiple choice questions 
    question = models.ForeignKey('ChallengeQuestion') 
    option = models.CharField(max_length=500) 
    is_answer = models.BooleanField() 

class ChallengeQuestionFB(models.Model): #for fill-in-the-blank questions 
    question = models.ForeignKey('ChallengeQuestion') 
    option = models.CharField(max_length=100) 
    sequence = models.SmallIntegerField(default=1, blank=True, null=True) 

class ChallengeQuestionTF(models.Model): #for true/false questions 
    question = models.ForeignKey('ChallengeQuestion') 
    is_correct = models.BooleanField() 

class ChallengeQuestionOR(models.Model): #for ordering type questions 
    question = models.ForeignKey('ChallengeQuestion') 
    option = models.CharField(max_length=500) 
    sequence = models.SmallIntegerField(default=1, blank=True, null=True) 

我很想下一步要做的是有相應的管理工具內嵌選項可用於每個問題,具體取決於question_type。

例如,如果我填寫了True/False類型的challenge_question,我希望可以使用True/False「is_correct」字段進行檢查或不檢查。如果問題是訂購類型,我希望訂單選項可以與順序字段一起提供。等等。

如果我只是添加到admin.py:

class ChallengeQuestionOptionsInline(admin.StackedInline): 
    model = ChallengeQuestionMC 
    extra = 2 

class ChallengeQuestionAdmin(admin.ModelAdmin): 
    inlines = [ChallengeQuestionOptionsInline] 

admin.site.register(ChallengeQuestion, ChallengeQuestionAdmin) 

那麼這顯然是行不通的,我想的方式。我需要在這裏有一些條件邏輯,比如「如果challenge_question是question_type'MC'那麼就使用ChallengeQuestionMC模型,依此類推。

我無法找到任何有關這種條件邏輯如何在django admin inline ...有什麼建議嗎?

+0

您是否試過爲每個問題類型添加內聯並將額外值設置爲0?它在管理頁面上有4個內聯。您可以將一些驗證邏輯添加到挑戰模型中,以便您也不會爲其保存多個類型。 – schillingt

+0

是的,我認爲額外= 0是現在的方式。感謝關於額外驗證邏輯的建議,我認爲你是對的,它是需要的。 – Renkai

回答

0

這段代碼沒有經過測試,所以可能需要調整。但是,在我看來,可能不是在整個ModelAdmin中定義全局內聯,而是實際上可以將它們設置爲在本地通過擴展change_view功能(這是管理系統用來更改特定對象的視圖)。它可能看起來像這樣:

class MCInline(admin.StackedInline): 
    model = ChallengeQuestionMC 

class FBInline(admin.StackedInline): 
    model = ChallengeQuestionFB 

class TFInline(admin.StackedInline): 
    model = ChallengeQuestionTF 

class ORInline(admin.StackedInline): 
    model = ChallengeQuestionOR 

class ChallengeQuestionAdmin(admin.ModelAdmin): 
    def change_view(self, request, object_id, form_url='', extra_context=None): 
     model = self.model 
     obj = self.get_object(request, unquote(object_id)) 

     if obj.question_type == 'MC' 
      self.inlines = [MCInline] 
     elif obj.question_type == 'FB' 
      self.inlines = [FBInline] 
     elif obj.question_type == 'TF' 
      self.inlines = [TFInline] 
     elif obj.question_type == 'OT' 
      self.inlines = [ORInline] 

     return super(MyModelAdmin, self).change_view(request, object_id, 
        form_url, extra_context=extra_context) 

再次,這是未經測試的,所以它很可能需要一些調整工作。

+0

感謝您的回答!我希望能找到一個解決方案,在選擇更改時更改管理員內聯。您的解決方案需要我先創建問題,然後才能使用相應的內聯(當我單擊「保存並繼續編輯」時)。現在足以讓我和他一起工作。再次感謝 – Renkai

+0

啊,我明白了。我認爲這可能需要通過加載所有內聯表單來實現,然後使用JQuery或類似的js方法來隱藏除了所選內容之外的所有內容。也就是說,不幸的是,超出了我的javascript能力(現在)。 – MBrizzle