Django 템플릿에 딕셔너리 데이터 혹은 이미지 나타내기

조회수 2820회

안녕하세요. scrapy로 다운받은 이미지 데이터를 장고 템플릿에 나타내는 방법을 질문 드립니다. 우선 스크래피로 다운받은 데이터필드는 장고 아이템을 사용해 Django model로 연결해 두었습니다. 다운된 해당 image field의 내용은 딕셔너리로 되어 있고 ({key1 : "value1", key2 : "value2", key3 : "value3"}) 처럼 구성되어 있습니다. 이중 key2 : "value2"가 로컬디스크에 저장되어있는 이미지 패스인데요 이 value2를 장고 템플릿에 넣으려고 시도하고 있는데 잘 되지 않네요 ㅠㅠ (이미지 패스가 아니라 img scr 하려고 합니다.)

일단 패스가 보여지는지를 보기 위해서

image : {{ actress.images['key2'][0] }}

로 시도해 봤는데 역시나 에러가 났습니다.

stackoverflow를 뒤져 보니 딕셔너리에서 value만 뽑는 방법이 있던데 이것보단 좀 더 좋은 방법이 있을 것 같은데 아이디어가 떠오르질 않네요 ㅠㅠ 그리고 스크래피의 관계된 다른 item (여배우 목록 크롤링인데 name과 image 두 개의 아이템(=장고 모델)이 있음)과 같이 템플릿에 보이는 방법이 무엇이 있을지 궁금 합니다.

자세히 알려주시지 않아도 되니 아이디어나 간단한 방법안내 정도만이라도 아시는 분이 계시다면 부탁 드립니다. ^

  • (•́ ✖ •̀)
    알 수 없는 사용자

2 답변

  • Charfield에 저장된다면 dict형이 아니라 dict를 str로 변환한 결과가 저장되는 것 같은데요. 심지어 [(True, {'checksum': '2b00042f7481c7b056c4b410d28f33cf', 'path': 'full/0a79c461a4062ac383dc4fade7bc09f1384a3910.jpg', 'url': 'http://www.example.com/files/product1.pdf'}), (False, Failure(...))] 이건 dict형도 아니고 리스트네요

    스크래피로 긁어와 오브젝트로 저장할 때, Charfield에 dict형을 바로 저장하는 게 아니라 dict형을 key-value로 끊어 적절히 모델 필드에 대입해주는 코드가 필요할 것같습니다.

    예를 들면

    
    data = {'checksum': '2b00042f7481c7b056c4b410d28f33cf', 'path': 'full/0a79c461a4062ac383dc4fade7bc09f1384a3910.jpg', 'url': 'http://www.example.com/files/product1.pdf'}
    
    ActressImage.objects.create(
        value1 = data['checksum'],
        value2 = ...
        )
    
    

    이런 식으로 쓰실 수 있을 것 같습니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 답변 감사합니다 ^^ 그런데 스크래피 메뉴얼을 보면 다운된(크롤링한) 데이터들에 접근할때에는 사전값에 접근하는 것처럼 item['key']으로 하고 있는데요 이 메뉴얼대로는 장고 템플릿에서 접근이 안되는 것 같아서요 ㅜㅜ 스크래피 은근히 불편하네요 ㅠㅠ 알 수 없는 사용자 2016.6.6 22:31
    • 장고 템플릿(html파일)에서는 dict형에 접근할 때 item.key 와 같이 접근하는 걸로 알고있습니다 알 수 없는 사용자 2016.6.7 12:55
  • admin.py에서 모델을 admin.site.register(모델명)과 같이 등록하신 후, 어드민 페이지에서 이미지 주소가 유효한지 확인 해 보셨나요?

    이미지 필드의 내용이 딕셔너리로 되어 있다는게 무슨 의미인지 모르겠는데요. 모델에서 모델 필드가 딕셔너리라는 의미인가요? 아니면 views.py에서 딕셔너리 형태로 전달한다는 의미인가요?


    Actress 모델 클래스에 nameimage필드가 있어야 한다면, 저라면

    # models.py
    
    class Actress(models.Model):
        name = models.CharField(max_length=100)
    
    class ActressImage(models.Model):
        actress = models.ForeignKey(Actress)
        value1 = models.CharField(max_length=100)
        value2 = models.ImageField(upload_to="...")
        value3 = models.CharField(max_length=100)
    
    

    이런 식으로 모델 2개를 만들어서 접근하겠습니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 넵 스크래피로 크롤링 후 다운되는 데이터가 딕셔너리로 필드에 채워 집니다. [(True, {'checksum': '2b00042f7481c7b056c4b410d28f33cf', 'path': 'full/0a79c461a4062ac383dc4fade7bc09f1384a3910.jpg', 'url': 'http://www.example.com/files/product1.pdf'}), (False, Failure(...))] 이런식으로 채워 집니다. ^^ 어드민 페이지도 확인해봤는데 이상은 없네요... 에러 메세지는 Could not parse the remainder: '[0]' from 'actress.images.path[0]' 입니다 ^^. 알 수 없는 사용자 2016.6.6 13:42
    • 딕셔너리로 필드에 채워진다고 하셨는데 그럼 해당 필드에 종류가 뭔지 알수 있을까요? 예를들어 models.CharField()처럼요 알 수 없는 사용자 2016.6.6 13:48
    • 넵 CharField 입니다 ^^ 알 수 없는 사용자 2016.6.6 18:16

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)