2017-09-13 14 views
0

所以我有以下型號:動態增量整場 - Django的

from django.db import models 

class Person(models.Model): 

    name = models.CharField(max_length=254) 
    image_url = models.CharField(max_length=254) 
    title = models.CharField(max_length=254) 
    bio = models.CharField(max_length=20000) 
    vote = models.IntegerField(default=0) 

    def __str__(self): 
     return self.name 

在哪裏投票,我想通過一個在每一次點擊來增加屬性。

以下幾點看法:正在連載後

  1. 顯示在我的/ API/URL我的所有對象:

    import json 
    from rest_framework.views import APIView 
    from rest_framework.response import Response 
    from urllib.request import urlopen 
    from .models import Person 
    from .serializers import PersonSerializer 
    from django.views.generic import ListView 
    
    class PersonApiView(APIView): 
        def get(self, request): 
         persons = Person.objects.all() 
         serializer = PersonSerializer(persons, many=True) 
         return Response(serializer.data) 
    
    class PersonView(ListView): 
        data = urlopen("<URL contatining JSON>").read() 
        json_persons = json.loads(data) 
        persons = Person.objects.all() 
        for person in json_persons: 
         if person['id'] not in [i.id for i in persons]: 
          Person.objects.create(id=person['id'], 
                name=person['name'], 
                image_url=person['image_url'], 
                title=person['title'], 
                bio=person['bio']) 
        model = Person 
        context_object_name = 'persons' 
    

    在的意見,我在做兩件事情。使用外部JSON URL

  • 創建對象這是我在我的html:

    {% for person in persons %} 
         <div class="container"> 
          <div ng-controller="mainController"> 
           <div class="row"> 
            <div class="col-xs-12 col-sm-5 col-md-4 col-lg-3"> 
             <img ng-src="{{person.image_url}}"/> 
            </div> 
            <div class="col-xs-12 col-sm-7 col-md-8 col-lg-9"> 
             <h2>{{ person.name }}</h2> 
             <h3>{{ person.title }}</h3> 
             <p>{{ person.bio }}</p> 
             <form method="POST"> 
              <h4>Want to work with {{ person.name }}? <img src="{% static "svg/thumbs-up.svg" %}"><input type="submit" value="Yes!"></h4> 
             </form> 
             <h5><b>{{ person.vote }}</b> people have said Yes!</h5> 
            </div> 
           </div> 
          </div> 
         </div> 
        {% endfor %} 
    

    這是我展示的所有信息。

    問題:

    我想要做的是能點擊<input>標籤有值「是的!」,並有{{person.vote}}增加一個。當然,我想將其保存在數據庫中。

    使用的ListView時,我怎樣才能做到這一點?或者我需要在我的views.py中創建另一個功能?

    謝謝你的時間。

  • +0

    您將需要創建一個表單是,呈現在您的模板。你會在你的視圖中捕捉它的提交,並增加投票計數器。您可以檢查如何處理在這裏https://docs.djangoproject.com/en/1.11/topics/class-based-views/generic-editing/ – Hisagr

    +0

    '如果人[「身份證」]不是基於類的視圖中的形式[i.id for i in persons]:Person.vote + = 1 Person.save()'將是最快的方式,但您應該將一個用戶字段添加到模型中,以便您可以正確識別用戶。 – hansTheFranz

    回答

    1

    在你的情況,你可以簡單地通過創建處理表決,並重定向回列表視圖功能視圖做到這一點公平。

    類似:

    def process_vote(request, person_id): 
        person = get_object_or_404(Person, id=person_id) 
        person.vote = F('vote') + 1 # Using an F expression to avoid race conditions 
        person.save() 
        return redirect('list_view') # Redirect to anywhere 
    

    那麼你的表格上,設置表單的動作參數去這一觀點網址

    +0

    嘿胡里奧,非常感謝你的幫助。現在,只是爲了澄清。我需要在我的views.py中創建這個函數正確嗎?這是我在我的urls.py https://gist.github.com/tp00012x/6d6e25d40bc61c09fbcf763c33169534,你說我應該創建一個新的URL,所以當我點擊<輸入值將其重定向到新的URL = 「是!」>?感謝您的幫助。 – Anthony

    +0

    嘿。您需要爲視圖'process_vote'創建一個URL,該URL接受url上的person_id鍵參數。它會是這樣的: 'url(r'^ api/vote /(?P [0-9] +)$',views.process_vote),'。將該網址添加到您的表單操作並將其傳遞給該用戶標識。重定向是從process_vote視圖到PersonList視圖。所以當用戶點擊按鈕時,它會發送請求。過程中的投票,後來它向用戶發送回列表 –

    +0

    胡里奧,我得到了它的工作的感謝。再次感謝你。現在,唯一的一點是它每次點擊後重新加載頁面。你知道我怎麼阻止它這樣做,所以它只是更新票數而不是整個事情? – Anthony