Первый аргумент функции get_object_or_404() должен быть моделью. Как я могу получить id пользователя в модели User?
Я пытаюсь сделать функциональность избранного, где пользователь может добавлять других пользователей в избранное. В представлении, где отображается профиль пользователя, у меня есть кнопка, которая добавляет пользователя или удаляет его, если он уже был добавлен. Проблема в том, что я не могу передать в представление пользователя, который будет добавлен в избранное.
models.py
class User(AbstractUser):
is_type1 = models.BooleanField(default=False)
...
class Type1(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
favorite = models.ForeignKey(User, on_delete=models.CASCADE, blank=True, related_name='favorite')
views.py
def FavoriteView(request, pk):
current_user = request.user
Type1.user = current_user.id
buser = Type1.user
Type1.favorite = get_object_or_404(User, id=request.POST.get('username')) # The of the error where I try to add the user being added as a favorite
fuser = Type1.favorite
if Type1.favorite.filter(id=request.user.id).exists():
Type1.favorite.remove(request.user)
else:
Type1.favorite.add(request.user)
return HttpResponseRedirect(reverse('profile-details', kwargs={'username': Type1.favorite}))
class UserView(DetailView):
model = User
...
template_name = 'users/profile-details.html'
def get_context_data(self, **kwargs):
data = super().get_context_data(**kwargs)
favorite_connected = get_object_or_404(Type1.favorite, id=self.kwargs['username']) # The of the error where I try to add the user being added as a favorite
favorite = False
if favorite_connected.favorite.filter(id=self.request.user.id).exists():
liked = True
data['user_is_favorite'] = favorite
return data
profile-details.html
...
{% if user.is_authenticated %}
<form action="{% url 'favorite' object.id %}" method="POST">
{% csrf_token %}
{% if user_is_favorite %}
<button type="submit" name="favorite" value="{{object.id}}">Not favorite</button>
{% else %}
<button type="submit" name="favorite" value="{{object.id}}">Favorite</button>
{% endif %}
</form>
{% else %}
<a href="{% url 'login' %}?next={{request.path}}">Log in to add user to favorites.</a><br>
{% endif %}
urls.py
path('profile/<str:username>/', UserView.as_view(), name='profile-details'),
path('favorite/<str:username>/', FavoriteView, name="favorite"),
Одна непосредственная проблема, которую я вижу, заключается в том, что ваш URL путь хочет строку для имени пользователя, но ваш URL для формы дает ему ID пользователя, так что это будет int
.
Что касается вашей ошибки, вы пытаетесь передать имя пользователя, но я не думаю, что оно будет в данных POST. Однако если бы это было так, вы должны быть в состоянии сделать;
get_object_or_404(User, username=request.POST.get('username'))
Однако, основываясь на моем первоначальном комментарии, вам, вероятно, следует просто получить пользователя по ID, как вы это делаете, но использовать PK пользователя, который поставляется с вашим представлением;
get_object_or_404(User, id=pk)
Вы также можете столкнуться с большим количеством ошибок, потому что вы присваиваете объект, если он существует, Type1.favorite
, а затем пытаетесь сделать Type1.favorite.filter(
, что приведет к неудаче. Вы можете только .filter()
на наборе запросов, а не на экземпляре модели.