简体   繁体   中英

Django QuerySet in template for relational models

I am trying to setup a relation with another model using FK in django but I can't call FK related model fields in django templates. In template when I call "provider.name" it shows me "None" as result. I do have 5 different suppliers listed and can see from admin. I have providers and I got products like below:

class Product(models.Model):
    title = models.CharField(max_length=500)
    description = models.TextField(blank=True, null=True)
    price = models.DecimalField(max_digits=20, decimal_places=2)
    sku = models.CharField(null=True, max_length=100)
    url = models.URLField(blank=True)
    slug = models.SlugField(unique=True)
    providers = models.ManyToManyField('Provider', blank=True)

    def __unicode__(self):
        return self.title

   class Provider(models.Model):
    name = models.CharField(max_length=200)
    description = models.TextField(null=True, blank=True)
    logo = models.ImageField(upload_to='products/')
    shipping_method = models.CharField(max_length=250)
    shipping_time = models.CharField(max_length=250)
    return_policy = models.CharField(max_length=200)
    free_delivery = models.CharField(max_length=200)
    customer_service_number = models.CharField(max_length=200)
    shipping_charges = models.CharField(max_length=200)

    def __unicode__(self):
        return self.name

In template the way I am calling it is:

{% with provider=object.providers %}
{{ provider.name }}
{% endwith %}

As result it shows "None" . I am trying to call provider in a different template. In it's own List/Detail generic views it works just fine. I am trying to call it in different app templates. Please advise.

Update................

My search.html for whoosh search engine includes

{% for result in page.object_list %}
            <div class="col-lg-1-5  col-md-3 col-sm-4 col-xs-12">
            <div class="pbox">
              <div class="photo">
                <a href="{{ result.object.get_absolute_url }}"><img src="{{ result.object.get_image_url }}" alt="product"></a>
              </div>
              <div class="info">
                <div class="url">
                name
                    {% for item in result.object.providers.all %}
                        {{ result.provider.name }}
                    {% endfor %}

                </div>
                <div class="description">
                  {{ result.object.description|truncatewords:7 }}
                </div>
                <div class="price">
                  {{ result.object.price|intcomma }}
                </div>
              </div>
            </div>
          </div>

As I am not using any ModelManager or just using default Managers pre-defined for models. I've added a line of code under Product App model like this:

def get_provider(self):
        item = self.providers.all()
        return item

I case of calling provider you call related manager so it return None because manager have no method like this.
If you want to retrieve objects from managers, you should call self.providers.all()
In your case, template tags should looks like this:

{% for item in object.providers.all %}
    {{ provider.name }}
{% endfor %}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM