2010-07-11 11 views
3

J'ai un modèle comme celui-ci:Django FileField: comment définir la valeur par défaut (créer automatiquement un fichier vide)?

class MyModel(models.Model): 
    name = models.CharField(max_length=255) 
    code = models.FileField() 

Lorsqu'un nouveau MyModel est soumis, je veux permettre le champ Code à gauche vide, dans ce cas, je dois Django pour créer un vide fichier (avec un nom arbitraire).

La question est: quelle est la droite façon de le faire?

Je ne trouvais rien d'apparenté dans les docs, donc je cherchais à éditer manuellement request.FILES avant de le donner à MyModelForm(), mais cela ressemble à un hack sale pour moi ... Des idées?

Merci.

+0

Comment prévoyez-vous d'utiliser la valeur soumise au champ de code? Un FileField ne sonne pas comme bon. –

+0

C'est un fichier avec du code Python qui est ensuite exécuté dans un environnement d'exécution sécurisé. Il doit d'abord être pré-compilé, donc l'avoir dans un fichier séparé semble le plus pratique. – letoosh

+1

la pensée de cela très franchement me donne les willies. C'est un énorme trou de sécurité. – eruciform

Répondre

2

Je stockerais l'entrée de code dans un champ CharField et ensuite créer une fonction séparée qui accède au modèle et si le code ne contient aucune méthode nuisible, il est alors écrit dans un fichier.

Cela prend en charge la création du fichier (car un champ CharField vide sera simplement sorti dans un fichier vide) et permet la délégation à un vérificateur de sécurité. Votre configuration serait alors ressembler à quelque chose comme ce qui suit: Modèle:

class MyModel(models.Model): 
    name = models.CharField(max_length=255) 
    code = models.CharField(MAX_FILE_LENGTH) 

Vue:

def Submit_Code(request): 
    #Create MyModel using POST data 
    process_input_file(NEWLY_CREATED_MODEL_NAME) 
    return HttpResponse("Upload Successful") 

def process_input_file(modelName): 
    #assuming unique name. Use "id=" instead if needed. 
    mm = MyModel.objects.get(name=modelName) 
    if passes_security_checks(mm.code): 
      f = open(mm.name, "r") 
      f.write(mm.code) 
      f.close() 

Modifier Vue:

def Submit_Code(request): 
    mm = MyModel() 
    mm.name = request.POST.get('name') 
    f = open(mm.name,"r") 
    f.write(request.POST.get('code') 
    f.close() 
    #then associate the newly created file with the FileField however you want 
    #passing through authentication/checking if need be. 
    return HttpResponse("Upload Successful") 
+0

Je mettrais le code process_input_file dans la méthode clean_code du formulaire, en manipulant ainsi toute la logique du formulaire en un seul endroit. –

+0

Je pense que le champ de code devrait être un TextField au lieu d'un CharField. Je crois que CharField est implémenté en tant que VARCHAR (255) dans MySQL, et j'imagine que vous voudriez avoir plus de 255 caractères de code. –

+0

C'est une bonne idée, mais avoir des données dupliquées dans le CharField me semble un peu exagéré. Pour l'instant, le code soumis est en cours de vérification, donc je ne vois pas de raison de le stocker séparément. J'ai tout ce qui est déjà implémenté et je veux juste laisser les utilisateurs omettre le champ de code et ensuite le modifier dans le navigateur. L'exécution sécurisée est complètement abstraite de l'instance de Django et n'a aucun accès à la base de données ou à quoi que ce soit. Ainsi, avoir le code dans un fichier est de loin le meilleur moyen. Enfin, pour le bien des autres ici, il serait bon de connaître la bonne solution. – letoosh

1

Il suffit de définir le champ pour permettre null et vide. Cela rendra le champ facultatif.

code = models.FileField(null=True, blank=True) 
+0

Je ne pense pas que cela créera un fichier vide comme souhaité. –

Questions connexes