2012-06-18 8 views
0

최근에 저는 Python과 Django를 실험하기 시작했습니다. 나는 그것을 좋아하지 만, 이미 많은 것을 배웠지 만 여전히 갈 길이 멀다.변수 필드 이름이있는 Django-for-loop

나는 5 개의 이미지 필드를 포함하는 모델을 만들었다. 모델 옆에 데이터를 입력하고 저장하는 양식을 만들었습니다. 여태까지는 그런대로 잘됐다.

  1. 업로드 할 새 이미지
  2. 데이터베이스

에서 '오래된'이미지를 삭제 나는 아래의 코드를 작성 : 은 이제 의미하는 업로드 한 이미지 '편집'의 또 다른 양식을 작성하려면

if form.is_valid(): 
      form_image = form.cleaned_data['image_1'] 
      try: 
       details = Model.objects.get(pk=pk) 
       if details.image_1 != form_image: 
        details.image_1.delete(save=False) 
      except: pass # when new photo then we do nothing, normal case 
      form.save() 

하지만 다음과 같은 문제로 고민하고 있습니다 :

그 한 이미지의 작업을 수행
  1. 5 개의 이미지 필드를 업데이트하기 위해이 코드를 어떻게 다시 작성할 수 있습니까? 최악의 경우 5 개의 이미지 필드를 모두 편집 할 수 있기 때문입니다. 나는 'for loop'로 시도했지만 결코 성공하지 못한다. 예를 들어 :

    image_list = [image_1, image_2, image_3, image_4, image_5] 
    if form.is_valid(): 
        for image in image_list: 
         form_image = form.cleaned_data[image] 
         try: 
          details = Model.objects.get(pk=pk) 
          if details.image != form_image: 
           details.image.delete(save=False) 
         except: pass # when new photo then we do nothing, normal case 
         form.save() 
    
  2. 논리의이 작품을 쓰기보다 지능적인 방법이 있습니다. 이 코드로 가지고있는 문제는 이미지의 이름을 검사한다는 것입니다. 그리고 같은 이름의 이미지가 여러 개있을 때 아마 잘못 될 것입니다 ...

누군가가 피드백을주고 올바른 방향으로 나를 다시 가리켜 주길 바랍니다.

감사합니다.

친절 감사는

+0

안녕을 사용해야

try: details = Model.objects.get(pk=pk) ... # django models have a special exception type # when they don't exist. except Model.DoesNotExist: pass 

을 동적으로 변수 조회로 그 문자열 이름을 사용하려면를 명명 문제는 해결 방법 :이 이름 바꾸기 기술을 사용하여 이미지 이름을 고유하게 만들 수 있습니다. [Django FileField with upload_to runtime at runtime] (http://stackoverflow.com/questions/1190697/django-filefield-with-upload-to-determined-at -실행 시간). 그러나 여전히 첫 번째 요점은 : 서로 다른 이미지를 반복하는 방법? 그리고이 코드 조각은 '지능적인'의미입니다. 이미지 업로드를 처리하는 가장 좋은 방법입니까? 감사! –

답변

0

당신은 문자열을 사용해야합니다

image_list = ['image_1', 'image_2', 'image_3', 'image_4', 'image_5'] 

# or doing that dynamically as well: 
image_list = ['image_%d' % i for i in xrange(1,6)] 

또한, 귀하의 예제에서, 당신이 고유 pk 값을 때마다 점점 곳에 확실하지 않다. 그러나 각 루프가 해당 특정 이미지와 비교할 다른 details 개체를 생성해야한다고 가정합니다.

한 가지 고려해야 할 점은 담요를 거의 사용하지 않아야한다는 것입니다. try, except: pass. 그것은 쉽게 고려하지 않은 오류 마스크 수 있습니다 : 당신은 그냥 다시 getattr

for image_name in image_list: 
    ... 
    # equiv to: details.image_1, details.image_2, ... 
    if getattr(details, image_name, None) != form_image: 
    ... 
+0

의견을 보내 주셔서 감사합니다. 문자열의 문제점은'details.image'에 사용할 수 없다는 것입니다. 코드에서 실제로 동일한 변수를 두 곳에서 반복하고 싶습니다 : form.cleaned_data [ 'variable']'과'details.variable'. 어떻게 든 가능합니까? 감사! –

+0

@ Köver :'getattr'을 사용하십시오.내 편집보기 – jdi

+0

좋아요! 테스트를 거쳐 작동합니다! 많은 분들께 감사드립니다. –

관련 문제