You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中get_object_or_404参数错误及用户收藏功能传参问题

问题分析与解决方案

核心错误原因

  • get_object_or_404() 第一个参数必须是模型类,你传入了Type1.favorite(模型字段),导致报错。
  • 直接操作Type1类而非实例,逻辑完全错误:收藏关系是用户实例之间的关联,不是类属性。
  • 模型设计不合理:ForeignKey只能关联单个用户,无法实现“一个用户收藏多个用户”的需求,需改为ManyToManyField。

1. 修正模型设计(models.py)

将收藏字段改为多对多,同时避免字段名与反向关联名冲突:

from django.contrib.auth.models import AbstractUser
from django.db import models

class User(AbstractUser):
    is_type1 = models.BooleanField(default=False)
    ...

class Type1(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
    # 改为ManyToManyField,支持收藏多个用户
    favorites = models.ManyToManyField(User, blank=True, related_name='favorite_by')

2. 修正视图逻辑(views.py)

收藏/取消收藏视图(FavoriteView)

from django.shortcuts import get_object_or_404, reverse
from django.http import HttpResponseRedirect
from .models import User, Type1

def FavoriteView(request, username):
    # 获取当前登录用户的Type1实例,不存在则自动创建
    current_type1, created = Type1.objects.get_or_create(user=request.user)
    # 获取要收藏的目标用户
    target_user = get_object_or_404(User, username=username)
    
    # 执行添加/取消收藏操作
    if target_user in current_type1.favorites.all():
        current_type1.favorites.remove(target_user)
    else:
        current_type1.favorites.add(target_user)
    
    # 跳回目标用户的个人资料页
    return HttpResponseRedirect(reverse('profile-details', kwargs={'username': username}))

用户资料视图(UserView)

from django.views.generic import DetailView
from .models import User, Type1

class UserView(DetailView):
    model = User
    template_name = 'users/profile-details.html'
    # 指定用username作为URL查询参数
    slug_field = 'username'
    slug_url_kwarg = 'username'

    def get_context_data(self, **kwargs):
        data = super().get_context_data(**kwargs)
        target_user = self.get_object()
        user_is_favorite = False
        
        # 仅当用户登录且为Type1用户时,检查收藏状态
        if self.request.user.is_authenticated and hasattr(self.request.user, 'type1'):
            user_is_favorite = target_user in self.request.user.type1.favorites.all()
        
        data['user_is_favorite'] = user_is_favorite
        return data

3. 修正模板传参(profile-details.html)

调整表单action参数,传递目标用户的username,简化按钮逻辑:

...
{% if user.is_authenticated %}
<form action="{% url 'favorite' object.username %}" method="POST">
    {% csrf_token %}
    {% if user_is_favorite %}
        <button type="submit">取消收藏</button>
    {% else %}
        <button type="submit">添加收藏</button>
    {% endif %}
</form>
{% else %}
    <a href="{% url 'login' %}?next={{request.path}}">登录后可添加用户到收藏</a><br>
{% endif %}
...

4. 修正URL配置(urls.py)

保持参数统一,均使用username:

from django.urls import path
from .views import UserView, FavoriteView

urlpatterns = [
    path('profile/<str:username>/', UserView.as_view(), name='profile-details'),
    path('favorite/<str:username>/', FavoriteView, name="favorite"),
]

内容的提问来源于stack exchange,提问作者nameless

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 15:51:02