#django #django-models #django-views #django-forms #django-templates
#django #django-модели #django-просмотры #django-forms #django-шаблоны
Вопрос:
У меня ошибка, когда я пытаюсь следить за пользователями, когда я нажимаю кнопку «Следовать» в каком-либо профиле пользователя, я должен следовать за ним, но происходит обратное, он следует за мной, но я не следую за ним
Моя модель
class Account(AbstractBaseUser):
email = models.EmailField(verbose_name="email", max_length=60, unique=True)
username = models.CharField(max_length=30, unique=True)
date_joined = models.DateTimeField(verbose_name='date joined', auto_now_add=True)
following = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True ,related_name="follow")
Вид
class AddFollwers(LoginRequiredMixin, View):
def post(self, request, pk, *args, **kwargs):
account = Account.objects.get(pk=pk)
account.following.add(request.user)
return redirect('account:view', account.pk)
class RemoveFollowers(LoginRequiredMixin, View):
def post(self, request, pk, *args, **kwargs):
account = Account.objects.get(pk=pk)
account.following.remove(request.user)
return redirect('account:view', account.pk)
URL-адреса
path('follower/<int:pk>/add', AddFollwers.as_view(), name='add-follower'),
path('follower/<int:pk>/remove', RemoveFollowers.as_view(), name='remove-follower'),
Шаблон html
{% if username == request.user.username %}
{% else %}
{% if is_following %}
<form action="{% url 'account:remove-follower' pk=id%}" method="POST">
{% csrf_token %}
<button type="submit" class="btn btn-danger">Unfollow</button>
</form>
{% else %}<form action="{% url 'account:add-follower' pk=id%}" method="POST">
{% csrf_token %}
<button type="submit" class="btn btn-success">Follow</button>
</form>
{% endif %}
{% endif %}
Комментарии:
1. Ваша логика представления
class AddFollwers
неверна.account
Должно быть установлено значениеrequest.user
иaccount.following.add()
значениеuser
, соответствующее вашемуpk
аргументу.2. Также не забудьте отметить ответ на ваши предыдущие вопросы, если они были полезны для вашего случая.
3. @Hisham___Pak не могли бы вы уточнить второе,
account.following.add()
вы это имели в видуaccount.following.add(user=pk)
4. @Hisham___Pak Не могли бы вы добавить свой ответ
5. @MohamedSoliman Он имеет в виду, что ты должен писать
request.user.following.add(account)
.
Ответ №1:
Ваша логика представления кажется неверной.
class AddFollwers(LoginRequiredMixin, View):
def post(self, request, pk, *args, **kwargs):
account = Account.objects.get(pk=pk)
account.following.add(request.user)
return redirect('account:view', account.pk)
Должно быть,
class AddFollwers(LoginRequiredMixin, View):
def post(self, request, pk, *args, **kwargs):
account = request.user # The currently logged in user.
follow_account = Account.objects.get(pk=pk) # The account that is to be followed.
account.following.add(follow_account)
return redirect('account:view', follow_account.pk) # So it redirects to follow_account user view.
Значительно расширив это, чтобы вы могли понять, вы также можете написать это другими способами, как предложил АбдулАзизБаркат. По сути, вы добавляете вошедшего в систему пользователя в следующую таблицу пользователя, за которым хочет следовать вошедший в систему пользователь. Но ожидая, что результат будет наоборот.