2016-11-08 49 views
0

強制性的,我是一個django初學者,我不明白爲什麼我的代碼不工作。如何檢查對象在模板中的哪個子類?

我想通過視圖中的父類進行排序以獲取對象,然後將該對象傳遞給模板。在該模板中,我爲每個子類顯示了某些字段,還有一些字段是從父類繼承的。

我試過在我的模板中使用isinstance(),但它引發了錯誤。之後,我嘗試通過我的模板中的if語句來檢查每個子類的靜態屬性。當這樣做時,沒有任何子類特定字段顯示。所以我試圖在視圖中設置屬性,並且仍然沒有顯示任何子類特定的字段。

下面是父對象類和子類中的一個(型號):

class Chunk(models.Model): 
    name = models.CharField(max_length=250) 
    text = models.CharField(max_length=500) 
    images = models.FileField() 
    question = models.CharField(max_length=250) 
    expected_completion_time = models.IntegerField(default=1) 
    keywords = models.CharField(max_length=250, blank=True, null=True) 
    topic = models.CharField(max_length=250, blank=True, null=True) 
    course = models.CharField(max_length=250, blank=True, null=True) 

    def get_absolute_url(self): 
     return reverse('detail', kwargs={'pk':self.pk}) 

    def __str__(self): 
     return self.name 


class Concept(Chunk): 
    application = models.CharField(max_length=500) 
    subconcept1 = models.CharField(max_length=500, blank=True, null=True) 
    subconcept2 = models.CharField(max_length=500, blank=True, null=True) 
    subconcept3 = models.CharField(max_length=500, blank=True, null=True) 
    subconcept4 = models.CharField(max_length=500, blank=True, null=True) 
    subconcept5 = models.CharField(max_length=500, blank=True, null=True) 
    subconcept6 = models.CharField(max_length=500, blank=True, null=True) 
    subconcept7 = models.CharField(max_length=500, blank=True, null=True) 
    subconcept8 = models.CharField(max_length=500, blank=True, null=True) 
    subconcept9 = models.CharField(max_length=500, blank=True, null=True) 
    subconcept10 = models.CharField(max_length=500, blank=True, null=True) 
    conceptimage = models.FileField(blank=True, null=True) 

    @property 
    def mode(self): 
     return "concept" 

這裏是視圖:

def startpomodoro(request): 
    key = getpriority(Chunk.objects.all()) 
    object = Chunk.objects.get(id=key) 
    a = random() > 0.5 
    mode = str() 
    if isinstance(object, Problem): 
     if a: 
      mode = "problemoutline" 
     else: 
      mode = "problemfull" 
    elif isinstance(object, Concept): 
     mode = "concept" 
    elif isinstance(object, Formula): 
     mode = "formula" 
    elif isinstance(object, Code): 
     mode = "code" 

    context = dict(object=object, mode=mode) 
    return render(request, 'pomodoro/pomodorogo.html', context) 

這裏是模板的相關部分:

  <center> 

       <p>{{ object.text }}</p> 

       {% if mode == concept %} 

        <p>{{ object.application }}</p> 

        <p>{{ object.subconcept1 }}</p> 

        {% if object.subconcept2 %} 

         <p>{{ object.subconcept2 }}</p> 

       {% elif mode == formula %} 

我不明白爲什麼我沒有任何這些方法來工作。我確信這是我執行的一個問題,但我不知道我做錯了什麼。

+0

但對象不是任何的茨艾倫東西。這是一個大塊,因爲這就是你要求的。 –

+0

當我創建這些其他東西時,它們被輸入到它們各自的數據表和塊表中。你是否在說我所做的只能讓我訪問Chunk表中的信息?如果是這樣,你能推薦任何適當的方法從塊到其相應的子類數據? – Era

+1

我看到的最簡單的解決方案是使用OneToOneField進行繼承。 因此,請檢查此[鏈接](https://docs.djangoproject.com/el/1.10/topics/db/examples/one_to_one/) –

回答

0

我認爲你必須在你的模型一些不必要的併發症,儘量簡化的模型:

class SubConcept(models.Model): 
    name = models.CharField(max_length=200) 


class Chunk(models.Model): 

    CHUNK_TYPES = [('P', 'Problem'), 
        ('C', 'Concept'), 
        ('I', 'Idea'), 
        ('K', 'Code'), 
        ('F', 'Formula')] 
    name = models.CharField(max_length=250) 
    text = models.CharField(max_length=500) 
    image = models.FileField() 
    question = models.CharField(max_length=250) 
    expected_completion_time = models.IntegerField(default=1) 
    keywords = models.CharField(max_length=250, blank=True, null=True) 
    topic = models.CharField(max_length=250, blank=True, null=True) 
    course = models.CharField(max_length=250, blank=True, null=True) 
    chunk_type = models.CharField(max_length=1, choices=CHUNK_TYPES) 
    application = models.CharField(max_length=200) 
    subs = models.ManyToManyField(SubConcept, blank=True, null=True) 

    def get_absolute_url(self): 
     return reverse('detail', kwargs={'pk':self.pk}) 

    def __str__(self): 
     return '{}'.format(self.name or '') 

    @property 
    def mode(self): 
     return dict(CHUNK_TYPES)[self.chunk_type] 

現在,您的看法是很簡單(我忽略了getpriority方法,因爲我不知道它做什麼):

def pomodoro(request): 
    obj = get_object_or_404(Chunk, pk=1) 
    return render(request, 'foo.html', {'obj': obj}) 

這是您的模板:

<center> 
<p>{{ obj.text }}</p> 
{% if obj.mode == 'Concept' %} 
    <p>{{ object.application }}</p> 
    {% for sub in obj.subs.all %} 
     <p>{{ sub.name }}</p> 
    {% endfor %} 
{% elif obj.mode == 'Formula' %} 
    ... 
</center> 
0

在我正在研究的一個Django項目中,我們遇到了類似於繼承模型類的問題。我們使用的解決方案是爲父類添加一個類型。

class Chunk(models.Model): 
    CONCEPT_TYPES = (
     ('Problem', 'Problem'), 
     ('Concept', 'Concept'), 
     ('Formula', 'Formula'), 
     ('Code', 'Code'), 
    ) 
    concept_type = models.CharField(max_length=7, choices=CONCEPT_TYPES) 
    ... 

然後在我們的模板,我們會做這樣的事情:

{% if object.concept_type == 'Concept' %} 
    <p>{{ object.concept.application }}</p> 
    <p>{{ object.concept.subconcept1 }}</p> 
{% elif object.type == 'Problem' %} 
    ... 
{% endif %} 

事情需要注意的是,在未來我不會再構建我的數據庫是這樣,除非有非常充分的理由和幾乎肯定有更好的解決方案。

你也應該嘗試改變你的if語句在views.py喜歡的東西:

if object.problem: 
    ... 
elif object.concept: 
    .... 

這可能意味着你不需要把一個類型行中您的模型。