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
相关产品推荐
相关产品推荐

