2013-03-14 1 views
4

나는 내 애플 리케이션을위한 각 보드에서 내 애완 동물 그림과 같은 버튼을 만들려고했지만 정수가 포함되어 있기 때문에 하나 만드는 방법을 알아낼 수 없다. 보통 생각과 이해가있다. 내가 만든 기능.Django Like Button

사용자가 같은 버튼을 클릭 할 때. 같은 버튼이 1 씩 증가하고 사진 근처에 표시됩니다.

이것은 내 그림 모듈입니다.

누군가가 같은 버튼의 기본을 만들 수 있도록 도와 줄 수 있습니까? 그래서 함수의 논리를 이해할 수 있습니다.

답변

15

많은 사용자가 많은 그림을 좋아할 수 있다고 가정합니다.

당신은 다른 모델이 필요합니다

이 같은 좋아하는 수

class Like(models.Model): 
    user = models.ForeignKey(User) 
    picture = models.ForeignKey(Picture) 
    created = models.DateTimeField(auto_now_add=True) 

을 그리고 전화 :

p = Picture.objects.get(...) 
number_of_likes = p.like_set.all().count() 

이 좋아하는 수를 높이려면 당신 수도 그래서보기에 그런 일 :

def like(request, picture_id): 
    new_like, created = Like.objects.get_or_create(user=request.user, picture_id=picture_id) 
    if not created: 
     # the user already liked this picture before 
    else: 
     # oll korrekt 

누군가가 동일한 버튼을 두 번 클릭 할 때마다 그는 1로 간주됩니다. 이 도움이

def picture_detail(request, id): 
    pic = get_object_or_404(Picture, pk=id) 
    user_likes_this = pic.like_set.filter(user=request.user) and True or False 

희망 : 현재 사용자가 이미 표시된 이미지를 좋아 아닌지

알아합니다.

+1

그가 Likes의 로그를 유지하고 싶다면 이것은 완벽합니다. 그렇지 않다면,'Picture' 모델의 단순한'number_of_likes' 필드는 제 생각에 그렇게 할 것입니다. –

+1

그래서 함수가 매번 1 씩 증가합니까? – donkeyboy72

+1

감사합니다. – donkeyboy72

0

나는 비슷한 것을하고 싶었고 "django-likes"앱을 사용하여 저를 위해 일했습니다. 모델의 끝에

secretballot.enable_voting_on(Picture) 

을 넣어 그리고 당신은보기 내에서 투표를 사용할 수 있습니다.

현재 위치를 볼 수 있습니다 https://pypi.python.org/pypi/django-likes/0.1

1

을 내가

먼저 응용 프로그램처럼 만들고 like.models 내부 설정하면 내 같은 버튼 응용 프로그램 경험 거 주입니다

from django.conf import settings 
from django.contrib.contenttypes.fields import GenericForeignKey 
from django.contrib.contenttypes.models import ContentType 

class LikeModel(models.Model): 
    user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1) 
    liked = models.BooleanField() 
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) 
    object_id = models.PositiveIntegerField() 
    content_object = GenericForeignKey('content_type', 'object_id') 

    timestamp = models.DateTimeField(auto_now_add=True) 

    def __unicode__(self): 
     return str(self.user.username) 

다음 우리는 우리가 실행됩니다 아약스 응용 프로그램이 있어야 공동 그런 다음 아약스 응용 프로그램을 작성하면 심장이나 엄지 손가락 또는 당신이 무엇을 원하는에 mmands 한 번의 클릭이 코드

def like_it(request): 
    user = request.user 
    if request.method == 'POST': 
     ObjectId = int(request.POST['objectid']) 
     Tip = str(request.POST['contentType']) 

     likes = LikeModel.objects.filter(object_id=ObjectId) # in here we filtered the particular post with its id 
     if likes: # if the particular post is there 
      if str(user) in str(likes): # then we check the user which is us, in there 
       like_obj = LikeModel.objects.get(user=user,object_id=ObjectId) #if we there and we returned this data, this part for saving data, I mean if this data is already created than we dont have to delete and create again, we just change LikeModel.liked true or false state, so that if you create like and it will never delete, it just change liked or like state 
      else: 
       pass 

     if Tip == 'UserPost': 
      post_content_type_by = UserPost.objects.all().first() 

      if str(user) not in str(likes): 
       like = LikeModel.objects.create(user=user,liked=True,content_type=post_content_type_by.get_content_type,object_id=ObjectId) 
       like.save() # if data is created then we say 'new' 
       okey = 'new' 

      elif str(user) in str(likes) and like_obj.liked: 
       like_obj.liked = False 
       like_obj.save() # if data is already there, then we save it False 
       okey = 'false' 

      elif str(user) in str(likes) and like_obj.liked == False: 
       like_obj.liked = True 
       like_obj.save() # if data is already changed to False and we save again to True 
       okey = 'true' 


    return render(request,'ajaxlike.html',{'likes':likes,'okey':okey}) 

단지 adjsut URL을 모델에서 아무것도 변경하고 ajax.views 들어가서 설정 해달라고 그 직후에 우리는 ajax 데이터를 반환하고 저장하기위한 아약스 템플릿을 만들 것입니다.HTML

{% if okey == 'new' %} 
    new 
    {% elif okey == 'false' %} 
    false 
    {% elif okey == 'true' %} 
    true 
    {% endif %} 

이제 인덱스 HTML을 생성하거나 JQuery와 코드 우리가 엄지 손가락을 클릭 위의 예제

$('.thumb').click(function(){ 
    var indx = $('.thumb').index(this) 
    var ObjectId = $('.ObjectId:eq('+indx+')').text() 
    $.ajax({ 
     type: 'POST', 
     url: '/ajax/ajaxlike/', 
     data: { 
     'contentType':'UserPost', 
     'objectid':ObjectId, 
     'csrfmiddlewaretoken': $('input[name=csrfmiddlewaretoken]').val(), 
     }, 
     success: LikePost, 
     dataType: 'html' 
    }); 

    function LikePost(data, textStatus, jqXHR){ 
     if($.trim(data) == 'new'){ 
     $('.thumb:eq('+indx+')').css('color','#FF0033'); 
     }else if($.trim(data) == 'false'){ 
     $('.thumb:eq('+indx+')').css('color',''); 

     }else if($.trim(data) == 'true'){ 
     $('.thumb:eq('+indx+')').css('color','#FF0033'); 

     } 
    } 
    }); 

버튼처럼 설정하고 쓰기하여 원하는 목적지 LikeModel에 데이터를 저장 한 다음 ajax 데이터를 반환하는 like.html에서 데이터가 새 것이고 엄지 손가락이 빨간색으로 채워지면 데이터가 거짓이면 데이터가 이미 저장되어 있음을 의미합니다. 하지만 지금은 삭제하고 싶다면 엄지 손가락을 보통 색으로 다시 채우고 싶습니다. 데이터가 사실이면이 게시물의 데이터처럼 이미 생성되었지만 엄지 손가락을 삭제하지만 이제는 다시 엄지 손가락을 쓰고 싶습니다. 빨간색 다시

좋아요이 거의 다하지만 페이지가있을 때 그냥 몇 가지 작은 코드를 작성하고 그것을

다시 모든로드 매우 간단하므로 페이지에 표시되지 likers 모든 색깔의 엄지 손가락을 새로 고치고 계산 기억한다

그래서 우리가 여기서 한 일은 앱과 비슷한 모양으로 만들어졌고 데이터베이스에있는 테이블과 유사하게 만들었습니다. 데이터가 사용자에 의해 생성 된 후에 사용자가 결코 삭제하지 않고 단지 부울 값에 의해 참 또는 거짓 상태로 변경되었습니다 필드 그래서 admi로 n 당신은 항상 우리에게 유용 할 수있는 모든 데이터를 보관할 것입니다. 그러나 까다로운 부분은 모든 이벤트가 자바 스크립트에 의해 처리되므로 jQuery로 코드를 작성하는 동안주의해야합니다. 예를 들어 아약스가 잘 작동하는지 확인하십시오. 당신의 페이지에서 첫 번째 예를 들어 당신이 10 게시물에 대한 다음 페이지 및 페이지를 자동으로 다른 10 게시물을로드하고 그런 다음 같은 버튼이 작동하지 않을 경우 페이지에서 귀하의 주요 jquery 코드 로드 된 div에서 작동하지 않을 것입니다. 따라서이 작업에 대한 추가 작업을해야합니다.

하지만 내 아이디어를 공유하고 싶고 아약스 앱을 좋아하고 싶었던 이유는 나를위한 버전 : D, 근실하게