2010-07-11 7 views
3

나는이 같은 모델을 가지고 : 새로운 MyModel가 제출되면Django FileField : 기본값을 설정하는 방법 (빈 파일 자동 생성)?

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

, 나는 비어 될 코드 필드에 허용 할,이 경우 내가 장고 빈을 작성해야 파일 (임의의 이름).

질문 : 무엇입니까 오른쪽 방법이 무엇입니까?

문서와 관련된 내용을 찾을 수 없으므로 수동으로 request.FILES를 편집하기 전에 파일을 MyModelForm()으로 보내기 전에 살펴 보았습니다. 그러나 이것은 더러운 해킹처럼 보입니다 ... 어떤 아이디어입니까?

감사합니다.

+0

코드 필드에 제출 된 값을 어떻게 사용 하시겠습니까? FileField는 적합한 것처럼 들리지 않습니다. –

+0

이것은 안전한 런타임 환경에서 실행되는 Python 코드가있는 파일입니다. 먼저 미리 컴파일해야하므로 별도의 파일로 작성하면 가장 편리합니다. – letoosh

+1

이 생각은 솔직히 저에게 유죄를줍니다. 이것은 거대한 보안 구멍입니다. – eruciform

답변

2

CharField에 코드 입력을 저장 한 다음 모델에 액세스하는 별도의 함수를 만들고 코드에 유해한 메서드가 포함되어 있지 않으면 파일에 기록됩니다.

파일 만들기 (빈 CharField가 빈 파일로 출력되기 때문에)는 보안 검사기로 위임 할 수있게 해줍니다. 모델 : 귀하의 설정은 다음과 같을 것이다

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

보기 :

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

편집 새로운보기 :

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

나는 process_input_file 코드를 폼의 clean_code 메서드에 넣을 것이다.이 방법은 모든 폼의 로직을 한 곳에서 처리한다. –

+0

코드 필드는 CharField 대신 TextField 여야한다고 생각합니다. CharField가 MySQL에서 VARCHAR (255)로 구현되었다고 생각합니다. 255 자 이상의 코드를 보유하고 싶습니다. –

+0

좋은 생각인데, CharField에 중복 된 데이터를 가지고있는 것은 저에게 잔인한 것처럼 보입니다. 잠시 동안, 제출 된 코드는 어쨌든 검사 중이므로 별도로 저장할 이유가 없습니다. 이미 구현 된 모든 것들을 가지고 있고 사용자가 코드 필드를 생략하고 브라우저에서 편집 할 수있게하고 싶습니다. 보안 런타임은 Django 인스턴스에서 완전히 추상화되어 있으며 DB 또는 다른 것에 액세스 할 수 없습니다. 따라서 코드를 파일에 저장하는 것이 가장 좋은 방법입니다. 마지막으로, 여기 다른 사람들을 위해서 올바른 해결책을 아는 것이 좋을 것입니다. – letoosh

1

그냥 널 (null)을 허용하도록 필드 설정 및 빈. 이것은 필드를 선택적으로 만듭니다.

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

이것은 빈 파일을 만들 것이라고는 생각하지 않습니다. –

관련 문제