Как я могу добавить кнопку «Мне нравится» в Django классе ListView - PullRequest
0 голосов
/ 05 февраля 2020

Я дергаю себя за волосы, пытаясь добавить кнопку «Мне нравится» в почтовое приложение моего сайта, но я хочу добавить ее в ListView, который содержит остальные записи постов, и у каждого есть возможность прокомментировал Я добавил Formixin для этого, так что теперь я не могу добавить еще одну форму для кнопки «Мне нравится», так как это означало бы два запроса на сообщения ... поэтому я не нахожу четкого решения ... Я читал здесь и там об использовании AJAX или Json техников, но поскольку я новое программирование, я вроде как застрял в нем ... кто-нибудь может предложить какой-нибудь совет?

1 Ответ

0 голосов
/ 05 февраля 2020

Хотя использование 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
...