Mam więc stronę, w której znajduje się wiele artykułów. (Być precyzyjnym, tytuły, które zostaną wznowione do artykułów napisanych na szablonie pojęciem.) I chcę mieć złożony w moim modelu, który liczy liczbę kliknięć każdego artykułu. (Nie chcę używać biblioteki django-hitcount).
.. Pozwól mi najpierw ci pokazać mój kod.
modele.py.py.

class Article(models.Model):
    number = models.IntegerField(primary_key=True)
    title = models.CharField(max_length=20, default="")
    url = models.URLField(max_length=100, default="")
    hits = models.IntegerField(default=0)

Szablon

...
<div class="col text-center">
    {% for q in allArticles %}
        <a href="{{q.url}}"><h2 id={{q.number}}>{{q.title}}</h2></a>
    {% endfor %}
</div>
...

Myślałem o użyciu imprezy onclick() w JavaScript, ale potem przechodzący dane z JavaScript do Django wydawały się zbyt trudne dla mnie w tej chwili.
.. Bardzo doceniłbym twoją pomoc. Dzięki.

0
Ryan Oh 23 lipiec 2020, 13:26

3 odpowiedzi

Najlepsza odpowiedź

Cóż, kiedy nie podejmujesz nowych wyzwań, przestajesz się uczyć!

Metoda OnClick wygląda jak najlepszy IMO, zobaczmy, co sugerują inni.

Szczerze mówiąc, przy użyciu JS i AJAX do komunikacji z serwerem Django może być na początku, ale jest bardzo łatwy.

Jeśli wiesz, jak utworzyć funkcję w swoim {x0}} i znać trochę JS, to tak jak każda inna klasyczna funkcjonalność.

Skonfiguruj urls.py dla funkcji widoku, który doda kliknięcie do licznika:

path('ajax/add_click', views.add_click name="add_click"),

Następnie utwórz funkcję widoku (kod Pseudo):

def add_click(request):
    # retrieve the article
    article_id = request.GET.get("articleId", None)
    # then retrieve the object in database, add 1 to the counter save and return a response

Teraz część "skomplikowana", żądanie ajax:

function add_one_click(articleId) {
        $.ajax({
            type: "GET",
            url: '/ajax/add_click', // you also can use {% url "app_name:add_click" %}
            data: {
                'articleId': articleId,
            },
            success: function() {
                console.log("hit added to article");
            }
        });
    }

Musisz dodać JS i AJAX lib do szablonu HTML, aby to działa.

Musisz także przejść w atrybucie OnClick Nazwa funkcji + Identyfikator artykułu onclick="add_one_click({{article.id}})"

Jeszcze jedna rzecz, tego typu widoku, jeśli nie chroniona może prowadzić do uzyskania fałszywych wyników.

2
sigmal 23 lipiec 2020, 16:10

Zamiast Q.url ma nowy adres URL (/article_count?id=q.id), który zdefiniujesz w projekcie Django

def article_count(req):
    _id = req.GET.get('id', '')
    # Query Aritcle and get object
    q = Article.objects.get(id=_id)
    # update the fields for clicks
    q.hits += 1
    q.save()
    # redirect the page
    return redirect(q.url)
0
jaswanth 23 lipiec 2020, 10:42

Edytuj:

Utwórz nowy adres URL, który obsługiwałby kliknięcie tekstu, powiedzmy

path('article/clicked/<article_number>', views.click_handler, name='click_counter')

Teraz w szablonie używaj tego adresu URL dla całego artykułu

<div class="col text-center">
    {% for q in allArticles %}
        <a href="{% url 'app_name:click_counter' q.number %}"><h2 id={{q.number}}>{{q.title}}</h2></a>
    {% endfor %}
</div>

Iw twoim views.py utwórz nowy kontroler

def click_handler(request, article_number):
    article = Article.objects.get(number=article_number)
    article.hits += 1
    article.save()
    # now redirect user to the outer link
    return redirect(article.url)
0
mursalin 23 lipiec 2020, 11:53