Ответ на твой вопрос выглядит так:
def post(self, request, *args, **kwargs):
...
Но. Зачем тебе переопределять POST в CreateView? Дополни form_valid до такого вида:
def form_valid(self, form):
instance = form.save(commit=False)
if instance.like == '+':
instance.user = request.user
instance.save()
else:
bad_mojo()
return redirect(self.get_success_url())
При этом непонятно, зачем в модели поле like, которое должно равняться "+". Может, у тебя его нет и ты просто запутался?
Тривиальная система лайков за статью будет выглядеть так:
в models.py:
class Like(Model): # Модель лайков
user = ForeignKey(User)
class Article(Model): # Твоя модель статьи
# Чтобы уменьшить количество записей в таблице Like, просто будем присваивать статьям
# один и тот же лайк через М2М связь.
likes = ManyToManyField(Like)
def like(self, user):
try:
like = Like.objects.get(user=user)
self.likes.add(like)
except Like.DoesNotExist:
self.likes.create(user=user)
Вьюху делаем максимально тупой (так как модель у нас жирная):
class LikeArticle(SingleObjectMixin, View):
model = Article
def post(self, request, *args, **kwargs):
obj = self.get_object()
obj.like(request.user)
return redirect(obj) # Чтобы использовать такую форму, нужно определить метод get_absolute_url для Article
В урлы мы пишем имя вьюхи, а не (говно)хардкодим в шаблонах:
...
url(r'article/(?P<pk>\d+)/like$', LikeArticle.as_view(), name='like-article'),
# Заметь, article/<id>/like, а не article/like/<id>. Архитектурно так более верно.
...
Ну и в шаблон осталось вставить:
<form action="{% url 'like-article' object.pk %}" method="POST">{% csrf_token %}
{# Где object - экземпляр статьи #}
<input type="submit"/>
</form>