Хотя использование AJAX (javascript XHR-запросов) будет правильным способом, поэтому не нужно обновлять страницу при нажатии кнопки «Нравится», вы можете сделать это без AJAX.
HTML
На стороне HTML вы можете иметь несколько форм (<form>
), по одной на каждое сообщение, которые имеют скрытое поле ввода, которое является идентификатором сообщения. , Вы установили это явно в шаблоне HTML, например,
{% for post in post_list %}
<h3>{{ post.title }}</h3>
<p>{{ post.summary }}</p>
<form method="post">
{% csrf_token %}
<input type="hidden" value="{{ post.id }}" name="{{ form.id.html_name }}">
<input type="submit">Like</input>
</form>
{% endfor %}
Таким образом, в основном вы многократно используете форму, изменяя атрибут "value", чтобы он соответствовал сообщению.
Django Форма
Добавление FormMixin
к вашему представлению является правильным шагом, просто используйте form_class
для пользовательского LikeForm
только с одним полем, которое представляет собой IntegerField с именем id
.
Просмотр
Добавив FormMixin
, вы получите метод form_valid()
, который вы хотите переопределить, чтобы сохранить:
def form_valid(self, form):
id = form.cleaned_data['id']
try:
post = Post.objects.get(id=id)
except Post.DoesNotExist:
raise Http404
post.likes.add(self.request.user) # assuming likes is a m2m relation to user
return redirect('post_list') # this list view