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.
3 odpowiedzi
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.
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)
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)
Nowe pytania
python
Python to wielozadaniowy, wielozadaniowy język programowania dynamicznie typowany. Został zaprojektowany tak, aby był szybki do nauczenia się, zrozumienia i użycia oraz wymuszania czystej i jednolitej składni. Należy pamiętać, że Python 2 oficjalnie nie jest obsługiwany od 01-01-2020. Mimo to, w przypadku pytań Pythona specyficznych dla wersji, dodaj znacznik [python-2.7] lub [python-3.x]. Korzystając z wariantu Pythona (np. Jython, PyPy) lub biblioteki (np. Pandas i NumPy), należy umieścić go w tagach.