def form_valid(self, form): #PostForm 객체를 저장하기 전에 글쓴이 정보를 저장해야함 #데이터베이스에 바로저장하지 않고 연동된 모델클래스로 변환 #p : 사용자 입력으로 제목,카테고리,글내용이 채워진 Post객체 #(아직 데이터베이스에 저장되지않음) p = form.save(commit = False) #request.user : 요청한 클라이언트의 로그인정보(User모델클래스객체) #이 요청을 한 클라이언트의 유저정보를 Post객체에 저장 p.author = self.request.user p.save() #데이터베이스에 저장 #사용자가 넘겨준 이미지,파일마다 객체 생성 #사용자가 넘겨준 이미지파일 마다 PostImage 객체 생성 #request.FILES : 클라이언트가 서버로 보낸 파일정보를 관리하는 변수(객체) #f : 사용자가 보낸 이미지파일의 실제정보 for f in self.request.FILES.getlist('images'): #새로운 PostImage객체를 생성(데이터베이스에 저장x) pi = PostImage() #이 요청으로 새로만들어진 Post객체와 연결 pi.post = p #사용자가 보낸 이미지파일 정보를 변수에 저장 pi.image = f pi.save()#데이터베이스에 새로운 PostImage객체 저장 #사용자가 넘겨준 첨부파일 마다 PostFile 객체 생성 for f in self.request.FILES.getlist('files'): pf = PostFile() pf.post = p pf.file = f pf.save() #완성된 글의 URL을 전달 return HttpResponseRedirect( reverse('blog:detail',args=(p.id,) ) )
def form_valid(self, form): #매개변수 form : is_valid()함수를 통과한 PostForm객체 #PostForm객체를 바탕으로 Post객체 저장 #글쓴이(author) 변수가 비어있으므로, 데이터베이스에 저장하지 않음 p = form.save(commit = False) #request.user : 요청한 클라이언트의 로그인 정보(User 모델클래스 객체) p.author = self.request.user p.save() #클라이언트가 보낸 첨부파일, 이미지 파일을 바탕으로 PostFile,PostInage객체 생성및 저장 #request.FILES : 클라이언트가 서버로 보낸 파일 정보를 관리하는 변수 #PostFile 객체를 생성 for f in self.request.FILES.getlist('files'): #f : 파일 정보 pf = PostFile() # 새로운 POSTFILE 모델클래스의 객체 생성 pf.file = f pf.post = p pf.save() #PostImage객체를 생성 for i in self.request.FILES.getlist('images'): #i : 이미지 정보 pi = PostImage() pi.post = p pi.image = i pi.save(); #완성된 글 페이지로 URL이동 return HttpResponseRedirect( reverse('blog:detail', args=(p.id,) ) )
def form_valid(self, form): obj = form.save(commit=False) #Post 객체로 변환 #self.request == 뷰 함수의 request 매개변수 obj.author = self.request.user#유저정보 채우기 obj.save() #객체를 데이터베이스에 저장 #사용자가 저장요청한 이미지파일, 파일 객체 생성 #name이 'images'인 파일데이터를 추출하는 방법 for f in self.request.FILES.getlist('images'): #PostImage 모델클래스의 객체 생성 #객체 생성 시 각 변수에 값을 대입 image = PostImage(post = obj, image = f) #image = PostImage() #image.post = obj #image.image = f image.save() #사용자가 준 파일 정보에서 'files'라벨로 온 데이터 추출 for f in self.request.FILES.getlist('files'): #PostFile 모델클래스의 객체 생성 file = PostFile(post = obj, file = f) file.save() #완성한 글의 URL로 이동 return HttpResponseRedirect(reverse('blog:detail', args=(obj.id,)) )
def form_valid(self, form): #form을 썼을때 save를 하면 바로 저장이 되었고, (매개변수commit=False면 저장이 안된다.) #Form객체를 Post객체로 변환 #Commit=False를 쓴 이유 : Post객체를 데이터베이스에 저장할 때 user변수에 #값이 들어있지 않은 상태기 때문에 에러가 발생 #p에는 지금 post객체가 저장되어 있다. #p : class에서 사용자 입력을 바탕으로 category, title, content변수가 채워져 있는 #새로운 Post객체 => p.category / p.title / p.content를 쓸 수 있음 # category, title, content는 앞으로 채워질거니까 빈칸으로 저장해져도 되는데 # User라는 변수는 비어있으면 안된다. 그래서 저장을 하기 전에 user의 값을 써야한다. # Post class의 변수 5개 중 pub_date는 자동 / 카테고리,타이틀,콘텐츠는 앞으로 채울거니까 비어있도 되는데(blank=True설정), 유저는 비어있으면 안된다. p = form.save(commit=False) #자동완성하면 안됨 #user정보를 클라이언트의 유저정보로 대입 #user정보는 request.user라는 변수에 저장됨 (사용자 요청정보가 있는 정보) #비로그인 상태는 None값이 저장되어 있다. #self.request : 해당 뷰를 요청한 클라이언트의 요청정보가 저장된 변수 #slef.request.user : 요청한 클라이언트의 User모델클래스 객체저장 변수 p.user = self.request.user #최종 저장전 user를 채워준다. #데이터베이스에 Post객체 저장 p.save() #새로운 객체 생성 # 저장을 하려면 빈칸을 허용하거나, 빈칸이 없어야 한다. # 다른 데이터는 blank=True이기 때문이고, user는 blank가 true가 아니다. # SET_NULL이라는 설정 값을 넣으면 user가 빈칸이어도 된다. # 사용자가 입력한 것은 request.POST / request.GET 으로 저장된다. # 사용자가 업로드한 파일 데이터를 바탕으로 PostFile 객체 생성 # 사용자가 업로드한 파일의 갯수만큼 반복 # self.request.FILES : 사용자가 업로드한 파일을 저장한 변수 # self.request.FILES.getlist(name속성이름) # : 해당 입력 공간에 업로드된 파일 데이터들을 추출 for f in self.request.FILES.getlist('files'): #files라는 이름으로 날라온 파일들을 list로 만들어내서 하나씩 추출해서 f라는 이름으로 반복문에서 활용하겠다. #files라는 이름은 form class에서 name 속성이다. #더블 클릭하여 자동 import/자동완성으로 안했을 경우 끝에 커서 대고 ctrl + space바 누르면 더블클릭하여 import 가능 pf = PostFile() #post변수(외래키)와 file변수가 있음 #두 변수가 다 채워져야 저장이 된다. pf.post = p #새로만들어진 Post객체와 연동 pf.file = f #사용자가 업로드한 파일을 FileField에 저장 pf.save() #두변수가 다 채워졌으므로 save # 사용자가 업로드한 이미지데이터를 바탕으로 PostImage객체 생성 # 사용자가 'images' 입력공간에 업로드한 파일들을 바탕으로 객체생성을 하는 과정 # forms.py에서 커스터마이징한 변수이름을 따오면 된다. for i in self.request.FILES.getlist('images'): #새로운 PostImage 객체 생성 - 데이터베이스에 저장 x pi = PostImage() pi.post = p pi.image = i pi.save() # blog:detail로 리다이렉트 # Detail view는 3개 변수 # 새로운 만들어진 Post객체의 id값으로 detail뷰의 주소 전달 return HttpResponseRedirect(reverse('blog:detail', args=(p.id, )))
def test_get_image_filename(self): """Testing getting image filename for upload""" #Arrange user = User.objects.create_user('testuser', 'testuser@unittest', 'testpass') test_post = Post(author=user, issue=Issue(issue_number=1), title='Test Post', text='Unittest' ) test_PostImage = PostImage(post=test_post) filename='test_image.jpg' expected = 'images/test-post-test_image.jpg' #Act image_file_name = m.get_image_filename(test_PostImage, filename) #Assert self.assertEqual(expected, image_file_name)
def form_valid(self, form): p = form.save(commit=False) p.author = self.request.user p.save() for f in self.request.FILES.getlist('files'): pf = PostFile() pf.file = f pf.post = p pf.save() for i in self.request.FILES.getlist('images'): pi = PostImage() pi.post = p pi.image = i pi.save() return HttpResponseRedirect(reverse('blog:detail', args=(p.id, )))
def form_valid(self, form): #Form 객체를 Post 객체로 변환 #p : 사용자 입력을 바탕으로 category, title, contents변수가 채워져 있는 새로운 Post객체임 #model.py에 post에는 category, title, contents, user, pub_date가 있음 #category, title, contents는 사용자가 입력하고, pub_date는 자동생성됨. #빈칸은 원래 저장되지 않으므로(저장 시 에러), contents처럼 blank함수를 써야하나, #user에는 지정하지 않았으므로 앞으로 채워야함. #commit=False : post객체를 DB에 저장할 때 user변수에 값이 들어있지 않은 상태기 때문에 에러가 발생함. #따라서 DB에 저장하지 않고 연동된 모델 클래스의 객체로 변환만 함 p = form.save(commit=False) #user 정보를 클라이언트의 유저정보로 대입 #self.request : 해당 뷰를 요청한 클라이언트의 요청정보가 저장된 변수 #self.request.user : 요청한 클라이언트의 User모델크래스 객체 저장 변수 p.user = self.request.user #DB에 Post객체 저장 #user변수에 값이 들어갔으므로 저장할 수 있게됨 p.save() #(post객체에 딸려온) 사용자가 업로드한 파일 데이터를 바탕으로 PostFile 객체 생성 #self.request.FILES : 사용자가 업로드한 파일을 저장한 변수 #self.request.FILES.getlist(form.py의 name속성 이름(images , files )) : 해당 입력공간에 업로듣된 파일 데이터들을 추출 #사용자가 업로드 한 파일의 갯수만큼 반복 for f in self.request.FILES.getlist('files'): #새로운 PostFile (model.py에 있는) 객체 생성 - DB에 저장 X pf = PostFile() pf.post = p #새로 만들어진 Post객체와 연동 pf.file = f #사용자가 업로드한 파일을 FileField에 저장 pf.save() #사용자가 업로드한 이미지 데이터를 바탕으로 PostImage 객체 생성 #사용자가 'images'입력공간에 업로드한 파일들을 바탕으로 객체 생성 for i in self.request.FILES.getlist('images'): #새로운 PostFile (model.py에 있는) 객체 생성 - DB에 저장 X pi = PostImage() pi.post = p pi.image = i pi.save() #blog:detail 로 리다이렉트 #새로 만들어진 Post객체의 id값으로 detail뷰의 주소 전달 return HttpResponseRedirect(reverse('blog:detail', args=(p.id, )))
def form_valid(self, form): #Form객체 생성시 Post객체로 변환 #why? : Post객체를 데이터베이스에 저장할 때 user변수에 값이 들어있지 않은 상태기 때문에 에러발생 #p : 사용자입력을 바탕으로 category,title,content변수가 채워져있는 새로운 Post객체 p = form.save(commit=False) #User정보를 클라이언트의 유저정보로 대입 #즉, category,user,title,content,pub_date 5가지 변수가 있는데 #빈칸이 없어야 함. category,title,content는 사용자가 채우고 pub_date는 자동적으로 채워지는데 #user는 값이 들어있지 않기 때문에 commit=False로 설정해야한다. #self.request : 해당 뷰를 요청한 클라이언트의 요청정보정보가 저장된 변수 #self.request.user : 요청한 클라이언트의 User모델클래스 객체저장변수 p.user = self.request.user #데이터베이스에 Post객체 저장 p.save() #사용자가 업로드한 데이터를 바탕으로 PostFile객체 생성 #사용자가 업로드한 파일의 갯수만큼 반복 #self.request.FILES : 사용자가 업로드한 파일을 저장한 변수 #self.request.FILES.gestlist(name속성이름) #: 해당 입력공간에 업로드된 파일 데이터들을 추출 for f in self.request.FILES.getlist('files'): pf = PostFile() #새로운 PostFile 객체 생성 - 데이터베이스에 저장X pf.post = p #새로 만들어진 Post객체와 연동 pf.file = f #사용자가 업로드한 파일은 FileField에 저장 pf.save() #사용자가 업로드한 이미지 데이터를 바탕으로 PostImage객체 생성 #사용자가 'images' 입력공간에 업로드한 파일들을 바탕으로 객체생성 for i in self.request.FILES.getlist('images'): #새로운 PostImage객체 생성 - 데이터베이스에 저장 X pi = PostImage() pi.post = p pi.image = i pi.save() #blog:detail로 리다이렉트 #새로 만들어진 Post객체의 id값으로 detail뷰의 주소 전달 return HttpResponseRedirect(reverse('blog:detail',args=(p.id,)))
def handle(self, *args, **options): posts = Post.objects.all() posts_without_images = [ post for post in posts if not post.get_images() and not post.sponsored ] broken_dict = {} for p in posts_without_images: print "++++++++++++++++" print "++++++++++++++++" print "++++++++++++++++" print "working on %s" % p.id all_urls = p.get_all_images_from_body() working_urls = p.get_working_images_from_body() broken_urls = p.get_broken_images_from_body() print all_urls print "working: %s, broken %s" % (working_urls, broken_urls) soup = Soup(p.body) #get the working url images and save them to server for url in working_urls: img = urllib2.urlopen(url).read() try: image_name = urlparse(url).path.split('/')[-1].replace( '%', '-') image_ext = image_name.split('.')[-1] image_name = image_name.split('.')[0] image_name = slugify(image_name) image_name = image_name[:25] image_name = image_name + '.' + image_ext im = Image.open(StringIO.StringIO(img)) im.verify() post_image = PostImage() post_image.post = p post_image._width = im.size[0] post_image._height = im.size[1] post_image.title = image_name rhiz_media_url = 'http://media.rhizome.org/blog/%s' % p.id if rhiz_media_url not in url: # 'downloading and saving image to disk' post_image.image.save(image_name, ContentFile(img), save=False) else: # 'image already on disk, saving path' post_image.image = url.replace( 'http://media.rhizome.org/', '') post_image.save() soup_image = soup.findAll('img', {"src": str(url)})[0] # for local testing soup_image[ 'src'] = "http://localhost:8000/media/%s" % post_image.image #production #soup_image['src'] = "http://media.rhizome.org/%s" % post_image.image except Exception, e: broken_urls.append(url) if broken_urls: broken_dict[p.id] = broken_urls p.body = soup.prettify() p.save()
def test_post_image_str(self): p = PostImage(name='test') self.assertEqual(p.name, str(p))
def handle(self, *args, **options): posts = Post.objects.all() posts_without_images = [post for post in posts if not post.get_images() and not post.sponsored] broken_dict = {} for p in posts_without_images: print "++++++++++++++++" print "++++++++++++++++" print "++++++++++++++++" print "working on %s" % p.id all_urls = p.get_all_images_from_body() working_urls = p.get_working_images_from_body() broken_urls = p.get_broken_images_from_body() print all_urls print "working: %s, broken %s" % (working_urls, broken_urls) soup = Soup(p.body) #get the working url images and save them to server for url in working_urls: img = urllib2.urlopen(url).read() try: image_name = urlparse(url).path.split('/')[-1].replace('%','-') image_ext = image_name.split('.')[-1] image_name = image_name.split('.')[0] image_name = slugify(image_name) image_name = image_name[:25] image_name = image_name +'.'+ image_ext im = Image.open(StringIO.StringIO(img)) im.verify() post_image = PostImage() post_image.post = p post_image._width = im.size[0] post_image._height = im.size[1] post_image.title = image_name rhiz_media_url = 'http://media.rhizome.org/blog/%s' % p.id if rhiz_media_url not in url: # 'downloading and saving image to disk' post_image.image.save(image_name, ContentFile(img), save=False) else: # 'image already on disk, saving path' post_image.image = url.replace('http://media.rhizome.org/','') post_image.save() soup_image = soup.findAll('img', {"src": str(url)})[0] # for local testing soup_image['src'] = "http://localhost:8000/media/%s" % post_image.image #production #soup_image['src'] = "http://media.rhizome.org/%s" % post_image.image except Exception, e: broken_urls.append(url) if broken_urls: broken_dict[p.id] = broken_urls p.body = soup.prettify() p.save()