1
votes

Django Afficher le premier élément de la liste des noms_connexes

Je travaille sur un projet utilisant Python (3.7) et Django (2.2) dans lequel j'ai implémenté deux modèles ItemModel et Images donc chaque élément aura plusieurs images et ajout d'un élément dans le modèle images et ajoutez un related_name mais lorsque j'essaie d'accéder à ces images dans le modèle Django, cela ne fournit aucune information concernant ces images.

Ici sont mes modèles: Depuis models.py final:

class Inventory(View, LoginRequiredMixin):
    def get(self, request):
        items = None
        try:
            items = ItemModel.objects.all()
        except ItemModel.DoesNotExist:
            return redirect('home')

        return render(request, 'app/inventory.html', {'all_items': items})

Mise à jour: Voici la fonction que j'utilise pour renommer les images:

{% for img in item.images.all %}
    {% if forloop.first %}
        <td> {{ item.images.first.name }}</td>
    {% endif %}
{% endfor %}

Et voici que j'essaye d'accéder à ces images pour un élément du modèle:

def images_directory_path(instance, filename):
    return '/'.join(['images', str(instance.item.id), str(uuid.uuid4().hex + ".png")])

Voici la vue :

De views.py:

class ItemModel(models.Model):
    stock_number = models.IntegerField(blank=False)
    title = models.CharField(max_length=255, blank=False)
    price = models.IntegerField(blank=False)
    description = models.TextField(max_length=1000)
    condition = models.CharField(max_length=255, choices=COND_CHOICES, blank=False)
    model = models.CharField(max_length=255)
    dimensions = models.CharField(max_length=255)
    make = models.CharField(max_length=255)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title


class Images(models.Model):
    item = models.ForeignKey(ItemModel, on_delete=models.CASCADE, related_name='images')
    image = models.ImageField(upload_to=images_directory_path)

qu'est-ce qui ne va pas ici? p>


8 commentaires

Quelle est votre opinion?


Salut @KostasCharitidis vue ajoutée!


ItemModel.objects.all () ne lèvera jamais une exception DoesNotExist , votre bloc try / except ne fait rien


comment ça devrait être?


Votre modèle Images n'a pas de champ name , que souhaitez-vous afficher?


Juste items = ItemModel.objects.all () , pas d'essai / sauf


Dans mon modèle Images , vous pouvez voir que j'ai ImageField Je veux afficher la première image pour cet élément.


Oui, j'ai besoin de ceci, url ou filename .


4 Réponses :


0
votes

Vous n'avez pas besoin de la boucle for

<td> {{ item.images.first.name }}</td>

Va ​​faire, car elle retournera la première image (s'il en existe une) sans avoir à boucler sur chaque image

p >


1 commentaires

rien retourné



1
votes

Il semble que vous ayez juste besoin de

{% for img in item.images.all %}
    {% if forloop.first %}
        <td> <img src="{{ img.image.url }}"/> </td>
    {% endif %}
{% endfor %}


0 commentaires

0
votes

en plus de la réponse de Rakesh, vous trouverez peut-être nécessaire de vérifier si l'image existe avant de la récupérer en ajoutant une autre instruction if.

Dans votre modèle , procédez comme suit;

< pré> XXX


0 commentaires

0
votes

JAMAIS accéder au nom associé comme ci-dessous, exemple:

{{ item.images.all.0.name }}

Cela entraînera une nouvelle requête à DB, à la place, vous devriez l'utiliser comme ceci: p >

{{ item.images.first.name }}

Cela n'a pas besoin d'une boucle for, également cela sera pré-extrait de la requête d'origine dans la vue, ajoutez simplement .prefetch_related () dans la requête d'origine dans la vue.

p >


0 commentaires