3 votes

Champ d'image par défaut de fichier statique Django

Je me demandais s'il existe un moyen d'utiliser un fichier image statique comme valeur par défaut pour un champ ImageField?

Je pose cette question car si vous écrivez quelque chose comme ceci parce que tout d'abord, je ne suis pas capable de télécharger le dossier de médias dans mon dépôt GitHub car j'y stocke les téléversements des utilisateurs, et le fichier par défaut sera toujours le même, donc je veux servir le fichier par défaut depuis le dossier statique mais les téléversements des utilisateurs depuis le répertoire des médias.

Si vous utilisez ceci:

image = models.ImageField(upload_to=/dossier/upload/, default=/img/par_defaut.jpg, blank=True, null=True)

Il essaiera de charger l'image par défaut depuis le répertoire des médias.

5voto

xyres Points 552

MISE À JOUR : Cette réponse ne fonctionne plus. Depuis la version 1.9, Django supprime le / initial du chemin d'accès au fichier pour le convertir en chemin relatif, puis ajoute /media/ au chemin.

Ce changement a été effectué en raison de ce ticket : https://code.djangoproject.com/ticket/25905

En alternative, j'aime cette réponse


Tout d'abord, regardez ces deux chemins :

/img/default.jpg    -   Chemin Absolu (commence par un slash)
img/default.jpg     -   Chemin Relatif (ne commence pas par un slash)

Maintenant, si votre chemin par défaut est absolu, alors Django ne convertira pas l'URL en /media/.../. Django ne convertit que les chemins relatifs.

Donc, si vous souhaitez servir le fichier par défaut depuis le dossier static, vous pouvez simplement définir un chemin absolu vers votre fichier comme ceci - /static/img/default.jpg.


En plus :

Vous pouvez même vérifier cela. Django utilise urllib.parse.urljoin pour créer l'URL. Essayez ceci :

>>> media_url = '/media/'
>>> abs_url   = '/img/default.jpg' # url absolu
>>> rel_url   = 'img/default.jpg'  # url relatif

>>> from urllib.parse import urljoin # sous Python 2 : from urlparse import urljoin

>>> urljoin(media_url, abs_url) # test avec url absolu
'/img/default.jpg'
>>> urljoin(media_url, rel_url) # test avec url relatif
'/media/img/default.jpg'

0voto

7guyo Points 177

Vous pouvez définir une méthode qui pointe vers l'image par défaut comme ceci;

def upload_place_pics(instance, filename):
    return "place_pics/{user}/{filename}".format(user=instance.user, filename=filename)
def default_place_pics():
    return "place_pics/default_pic.jpg"

class Place(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, on_delete=models.CASCADE)
    name = models.CharField(max_length=300)
    image = models.ImageField(default=default_place_pics, upload_to=upload_place_pics, null=True)

Pour plus de détails sur la configuration des fichiers statiques, consultez la documentation

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X