通过外键和{%if / else%}

时间:2019-02-21 18:17:40

标签: django django-models django-templates django-views

我试图访问通过ImageField分配给另一个模型的模型的ForeignKey

我的项目中有不同的Animal Apps,它们的结构几乎相同,例如以下models.py。在“我的项目”的登录页面上,我想显示每个(种类)模型的名称和图片的最后3个条目。如果“物种”没有图片,我想显示“农场”的ImageField,它通过ForeignKey连接到我的物种。

cows / models.py

class Farm(models.Model):
    name = models.CharField(max_length=100)
    farm_img = models.ImageField(upload_to='farm_images/',
    max_length=255, null=True, blank=True)

class Cows(models.Model):
    farm = models.ForeignKey(Farm, on_delete=models.CASCADE, null=True)
    name = models.CharField(max_length=100)
    entry_date = models.DateField(null=True, blank=True)
    cow_img = models.ImageField(upload_to='farm_images/',
    max_length=255, null=True, blank=True)

Views.py

class HomeIndex(TemplateView):
    template_name = 'home.html'

    def get_context_data(self, **kwargs):
    context['chickens'] = Chicken.objects.order_by('-entry_date')[:3]
    context['cows'] = Cows.objects.order_by('-entry_date')[:3]
    context['cats'] = Cats.objects.order_by('-entry_date')[:3]

        return context

home.html

<….>
        {% for somecow in cows %}
        <div class="col-3" id="p1">
            <h2>{{ somecow.name }}</h2>
            <h2>{{ somecow.entry_date }}</h2>
            {% if somecow.cow_img %}
            <img src="{{ somecow.cow_img.url }}" alt="Mod" height="100">
            {% endif %}
        </div>
        {% endfor %}
<….>

直到它起作用为止。


但是我如何访问模型的FK.Model?

或者换句话说,我该如何告诉Django:

“如果在Cow.Model中没有找到母牛的图片,然后显示分配的Farm.Model中的Farm图片?”

据我了解,我可以通过

访问分配的FK模型

{% for something in MyModel1.MyModel2_set.all %}

我对home.html的处理方式

<….>
 {% for somecow in cows %}
    <div class="col-3" id="p1">
     <h2>{{ somecow.name }}</h2>
     <h2>{{ somecow.entry_date }}</h2>

      {% if somecow.cow_img %}
          <img src="{{ somecow.cow_img.url }}" alt="Mod" height="100">
      {% else %}

           {% for farm in somecow.farm_set.all %}
               {% if farm.farm_img %}
               <img src="{{ farm.farm_img.url }}" alt="Mod" height="100">
               {% endif %}
          {% endfor %}
      {% endif %}
    </div>
{% endfor %}
<….>

到目前为止,我没有收到任何错误消息,但也没有看到服务器场映像。我确定我在home.html中混入了一些东西。另一方面,我想我也许错过了某些观点,例如MyModel.objects.all()

我很感谢每一个提示。

1 个答案:

答案 0 :(得分:1)

您太复杂了。每头奶牛只有一个农场:您只需要直接访问它即可。

   {% else %}
       {% if cow.farm.farm_img %}
           <img src="{{ cow.farm.farm_img.url }}" alt="Mod" height="100">
       {% endif %}
   {% endif %}