如何检查对象在模板中的子类?

2024-04-20 08:49:56 发布

您现在位置:Python中文网/ 问答频道 /正文

强制性的,我是一个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 %}

我不明白为什么我没有这些方法。我确信这是我在执行过程中遇到的问题,但我不知道我做得不对。你知道吗


Tags: self模板trueifobjectmodemodels子类
2条回答

在我从事的一个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语句视图.py例如:

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

这可能意味着您不需要在模型中放置类型行。你知道吗

我认为您的模型中存在一些不必要的复杂性,请尝试简化模型:

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>

相关问题 更多 >