django get_object_or_404()的第一个参数必须是一个模型,我怎样才能将用户的id输入到用户模型中?

z2acfund  于 2022-11-26  发布在  Go
关注(0)|答案(1)|浏览(129)

我正在尝试创建一个收藏夹功能,用户可以将其他用户添加为收藏夹。在显示用户配置文件的视图中,我有一个按钮,可以添加用户或删除已添加的用户。问题是,我无法将添加为收藏夹的用户传递到视图。
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"),
ulydmbyx

ulydmbyx1#

我看到的一个直接问题是,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(,这将失败。你只能在一个queryset上,而不是一个模型示例上执行.filter()

相关问题