3 Stimmen

Django FileField: Wie kann man einen Standardwert setzen (leere Datei automatisch erstellen)?

Ich habe ein Modell wie dieses:

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

Wenn ein neues MyModel eingereicht wird, möchte ich, dass die code Feld leer gelassen werden, in diesem Fall brauche ich Django, um eine leere Datei (mit beliebigem Namen) zu erstellen.

Die Frage ist: Was ist die rechts wie man es macht?

Ich konnte nichts in der Dokumentation finden, so dass ich auf manuelle Bearbeitung request.FILES vor der Einspeisung in MyModelForm() sah, aber das sieht aus wie ein schmutziger Hack zu mir... Irgendwelche Ideen?

Danke.

2voto

Josiah Punkte 4574

Ich würde den eingegebenen Code in einem CharField speichern und dann eine separate Funktion erstellen, die auf das Modell zugreift, und wenn der Code keine schädlichen Methoden enthält, wird er dann in eine Datei geschrieben.

Dies sorgt für die Erstellung der Datei (da ein leeres CharField einfach in eine leere Datei ausgegeben wird) und ermöglicht die Delegation an einen Sicherheitsprüfer. Ihr Setup würde dann etwa wie folgt aussehen: Modell:

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

Ansicht:

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()

bearbeiten Neue Ansicht:

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")

0voto

Soviut Punkte 83233

Stellen Sie das Feld einfach so ein, dass es Null und Leerzeichen zulässt. Dadurch wird das Feld optional.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X