2016-01-25 4 views
2

Je veux traiter les plaques avec django. Pour cela, j'ai besoin d'utiliser Choicefield et FilePathField.Comment combiner le champ de choix django avec filepathfield

Je ne sais pas vraiment comment les combiner. Le champ de choix sous la forme fonctionne comme prévu

class TaskBlockForm(forms.ModelForm): 
    """ form used for creating a taskblock 
     :param forms.ModelForm: superclass of forms. 
    """ 
    users = forms.ModelMultipleChoiceField(queryset=DemoUser.objects.all()) 

    upload_by_file = forms.BooleanField() 
    file = forms.FileField(label=_('Init script'), required=False) 

    template = forms.ChoiceField(widget=forms.Select(), choices=[(0, 'WorldDB'), (1, 'ArticleDB'), (2, 'SampleDB')]) 
    date = forms.DateField(widget=SelectDateWidget(), label=_('maturity date'), initial=timezone.now()) 

Le modèle ressemble

def generate_templatename(instance, filename): 
    """ 
    helper method to generate path and filename for a template sql file of a taskblock 
    :param instance: taskblock instance 
    :param filename: filename 
    :return: relative url of file path 
    """ 
    url = "template/%s/%s" % (instance.name, filename) 
    return url 


class TaskBlock(models.Model): 
    """ 
     model of a taskblock 
    """ 
    name = models.CharField(max_length=20) 
    description = models.TextField() 
    create_stamp = models.DateTimeField(default=timezone.now) 
    file = models.FileField(upload_to=generate_filename, blank=True) 
    template = models.FilePathField(path=generate_templatename, default='DEFAULT') 

    def __str__(self): 
     return self.name 

(le paramètre de l'URL du fichier doit être juste - je suis en utilisant la même approche pour stocker des fichiers dans le répertoire/répertoire media/documents)

Comment puis-je combiner les deux, pour que je puisse choisir le modèle directement? ou dois-je le configurer manuellement dans view.py plus tard?

Répondre

0

J'ai trouvé la solution. Le problème était le cheminement.

la fonction:

def generate_templatename(instance, filename): 
    """ 
    helper method to generate path and filename for a template sql file of a taskblock 
    :param instance: taskblock instance 
    :param filename: filename 
    :return: relative url of file path 
    """ 
    url = "template/%s/%s" % (instance.name, filename) 
    return url 

ne peut pas être utilisé. Au lieu de cela le chemin doit être défini comme suit:

template = models.FilePathField(path=settings.MEDIA_ROOT + settings.TEMPLATE_URL,recursive=True) 

MEDIA_ROOT est défini dans le settings.py et pointe vers le répertoire/media

MEDIA_ROOT = os.path.join(BASE_DIR, 'media') 
TEMPLATE_URL = '/templates/' 

Maintenant, le formulaire peut utiliser le modèle au lieu de définir un nouveau modèle variable

template = forms.ChoiceField(widget=forms.Select(), choices=[(0, 'WorldDB'), (1, 'ArticleDB'), (2, 'SampleDB')]) 

n'est plus utilisé, étendre simplement les méta-paramètres par:

class Meta: 
     model = TaskBlock 
     # use following model fields 
     fields = ('name', 'description', 'template')