2017-01-17 1 views
2

Il existe un modèle Language. Les objets de langage créent Admin via Django-admin. Ils doivent choisir dans le menu déroulant du fichier de drapeau approprié.Django FilePathField ne fonctionne pas avec le chemin relatif

Le problème est qu'il n'y a pas d'indicateur à choisir lorsque je déploie un projet.

Puisque les fichiers statiques sont recueillis avant Deploy, j'ai essayé de définir ce chemin:

flag = models.FilePathField(path='static/img/flags/550px',default='') 

Mais comme vous pouvez le voir, il ne trouve rien.

enter image description here

Je peux choisir de drapeaux si je fais ceci:

flag = models.FilePathField(path=settings.BASE_DIR+'/static/img/flags/550px',default='') 

Mais il ne fonctionne pas seulement d'appeler language.flag car elle retourne un chemin absolu.

<img src = "{{ language.flag }}"> 

ce produit:

<img src="/home/django/MyProject/static/img/flags/550px/ar.png"> 

La seule solution qui me vient à l'esprit est de créer une propriété qui bandes path coupe "/ home/django/MyProject /" mais je ne suis pas sûr c'est une bonne idée.

Y a-t-il un meilleur moyen?

class Language(models.Model): 
    shortcut = models.CharField(max_length=40, 
           help_text=_('Shortcut of the language'), 
           unique=True) 

    name = models.CharField(max_length=40, 
          help_text=_('Name of the language'), 
          unique=True, verbose_name=_("Language")) 

    flag = models.FilePathField(path='static/img/flags/550px',default='/static/img/icons/check-icon.png') 

    def __str__(self): 
     return self.name 

EDIT:

Admin.py:

from django.contrib import admin 
from models import Language 

admin.site.register(Language) 

Répondre

1

FilePathField.path
requis. Le absolu chemin du système de fichiers vers un répertoire à partir duquel ce> FilePathField devrait obtenir ses choix. Exemple: "/ home/images".

Emphasis mine. Et quand vous utilisez un chemin absolu ici, votre template produit vraiment un chemin relatif Je ne peux pas vous dire ce que c'est parce que ce chemin que vous avez défini dans le FilePathField et le chemin que vous prétendez se contredire . Mais je peux vous assurer que le modèle donnera un chemin relatif.

Vous ne savez pas si c'est un bogue (c'est probablement le cas) mais votre administrateur enregistre le chemin d'accès complet dans l'objet indicateur au lieu du chemin relatif. Donc je suppose que utilise une propriété est une option

@property 
flag_path(self): 
    return self.flag.replace(settings.BASE_DIR,'') 

L'autre option est de overide la méthode admin enregistrement modèle pour faire le décapage à ce moment

+0

Non, quand je fais {{}} language.flag dans modèle que je reçois/home/django/myproject/static/... mais j'ai besoin/statique/.... donc je ne comprends pas quoi faire. –

+0

Fixez d'abord les incohérences dans votre question. Ensuite, ajoutez l'administrateur. Je suppose que vous pourriez avoir un problème là – e4c5

+0

Quelles incohérences voulez-vous dire? J'ai corrigé un chemin.Le problème est que FilePathField me permet de choisir parmi les drapeaux s'il y a un chemin absolu (BASE_DIR +/static/....). Mais quand je choisis des drapeaux de cette façon, alors, dans le template, {{language.flag}} renvoie/home/django/myproject/static/... mais j'ai juste besoin de/static/.... –