Первый аргумент функции 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() на наборе запросов, а не на экземпляре модели.

Вернуться на верх