2011-06-14 2 views
1

J'ai un utilisateur avec une photo de profil. L'image sera convertie en deux tailles: une qui sera affichée pour son profil (environ 200 px de large) et une plus petite vignette qui sera affichée dans les résultats de recherche (environ 64 px de large).Plusieurs images liées au profil d'un utilisateur

Quelle serait la meilleure façon de construire la base de données et la structure de dossier pour cela?

Mes deux idées pour la structure db sont:

# 1) 
class UserProfile(models.Model): 
    user = models.ForeignKey(User, unique=True) 
    ... 
    avatar = models.ImageField(upload_to='images/%Y/%m/%d', blank=True,) 
    avatar_thumbnail = models.ImageField(upload_to='images/%Y/%m/%d', blank=True,) 

# 2) 
class UserProfile(models.Model): 
    user = models.ForeignKey(User, unique=True) 
    ... 

class Avatar(models.Model): 
    avatar = models.ImageField(upload_to='images/%Y/%m/%d') 
    user = models.ForeignKey(UserProfile) 

Lequel serait une meilleure façon de gérer cette situation? Et quel serait un bon moyen de structurer mon dossier d'image pour séparer et référencer facilement les deux tailles d'image? Je vous remercie.

Répondre

1

Je dirais que la deuxième option serait effectivement mieux. Potentiellement diviser dans une application séparée tout à fait. J'ai trouvé qu'il est préférable de garder les fonctionnalités compartimentées. Gardez tout ce qui concerne votre avatar dans une application et gardez le code de la miniature, etc., ainsi que la création d'une balise de modèle pour afficher l'avatar. Il peut y avoir déjà une application pour cela ...

+0

merci pour la réponse. Et comment organiseriez-vous la structure de fichier pour les deux images différentes? – David542

+0

Theres deux écoles de pensée. Vous pouvez d'abord créer un dossier vignettes à côté de votre dossier images avec une structure de répertoire interne identique. Je préfère la seconde, qui serait de créer un répertoire de pouces à côté du fichier de votre vignette, et de garder les vignettes là-bas. quelque chose comme: upload_to = 'images /% Y /% m /% d/thumbs /' – Hutch

+0

voulez-vous jamais créer un dossier séparé pour chaque utilisateur, par exemple, upload_to = 'images /% s /% Y /% m/% d/thumbs/'% (nom d'utilisateur)? – David542

2

Vous pouvez utiliser Sorl Thumbnail, télécharger une image et créer la plus petite version à la volée en utilisant le (s) tag (s) de modèle de Sorl. Cela vous éviterait également d'avoir à créer une autre classe. J'ai eu beaucoup de succès avec cette bibliothèque, j'espère que ça vous aidera.

http://pypi.python.org/pypi/sorl-thumbnail/11.05.2

+0

@Brandon: merci pour la réponse. Je n'ai utilisé que PIL pour le traitement d'image jusqu'à présent, mais créer des vignettes "à la volée" rendrait Sorl beaucoup plus lent? Par exemple, si j'ai une page de 50 utilisateurs avec 50 miniatures. – David542

+1

L'image est créée une seule fois, puis mise en cache, donc la première fois que cela se produit, il y aura un peu plus de temps de traitement pour créer l'image. Honnêtement, je n'ai jamais vu assez de retard pendant ce temps de traitement pour le remarquer. Je l'ai implémenté sur à peu près tous les sites Django que j'ai jamais créés. – Brandon

+0

@Brandon: Sorl nécessite-t-il la mise en place d'un cache dans Django? – David542

Questions connexes