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>
4 Réponses :
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 >
rien retourné
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 %}
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é> XXXJAMAIS 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 >
Quelle est votre opinion?
Salut @KostasCharitidis vue ajoutée!
ItemModel.objects.all ()
ne lèvera jamais une exceptionDoesNotExist
, votre bloc try / except ne fait riencomment ça devrait être?
Votre modèle
Images
n'a pas de champname
, que souhaitez-vous afficher?Juste
items = ItemModel.objects.all ()
, pas d'essai / saufDans mon modèle
Images
, vous pouvez voir que j'aiImageField
Je veux afficher la première image pour cet élément.Oui, j'ai besoin de ceci,
url
oufilename
.