Django项目关注系统POST功能故障,寻求解决方案
Django 关注系统 POST 请求修复方案
核心问题梳理
- 类视图方法误用:继承
View时,处理POST请求需重写post方法,而非get_context_data(后者用于模板上下文传递,属于TemplateView等子类的方法) - URL配置错误:
as_view必须加括号as_view(),否则无法生成有效视图实例 - 表单Action路径错误:硬编码的
follow-test-action无法匹配正确路由 - 代码逻辑漏洞:调用不存在的
request.profile,应为request.user;reverse_lazy中pk未定义;多对多字段执行add/remove后无需手动调用save()
修正后的完整代码
1. Views.py 修正
from django.shortcuts import get_object_or_404, redirect from django.views import View from django.contrib.auth.mixins import LoginRequiredMixin from .models import NewUser # 加入LoginRequiredMixin确保只有登录用户能操作 class FollowView(LoginRequiredMixin, View): def post(self, request, slug): # 通过slug获取目标用户(匹配URL中的slug参数) target_user = get_object_or_404(NewUser, slug=slug) action = request.POST.get('follow') if action == "unfollow": # 登录用户取消关注目标用户,操作登录用户的follows字段 request.user.follows.remove(target_user) elif action == "follow": request.user.follows.add(target_user) # 重定向回目标用户的详情页(替换'profile'为你实际的详情页URL名称) return redirect('profile', slug=slug)
2. urls.py 修正
from django.urls import path from .views import FollowView urlpatterns = [ # 修正as_view()调用,明确slug参数类型 path('user/<slug:slug>/follow/', FollowView.as_view(), name='follow'), # 保留你的用户详情页路由(示例) # path('user/<slug:slug>/', ProfileDetailView.as_view(), name='profile'), ]
3. 模板表单修正
<form method="POST" action="{% url 'follow' newuser.slug %}"> {% csrf_token %} {% if newuser in user.follows.all %} <button class="btn btn-sm btn-light rounded-3" name="follow" value="unfollow" type="submit">unfollow</button> {% else %} <button class="btn btn-sm btn-outline-success rounded-3" name="follow" value="follow" type="submit">Follow</button> {% endif %} </form>
额外优化建议
- 删除模型中冗余的
user字段,避免与内置用户属性混淆:
class NewUser(AbstractUser): # 移除冗余字段 # user = models.ManyToManyField("self", related_name="profile", symmetrical=False, blank=True) slug = AutoSlugField(populate_from='first_name', unique_with='last_name') follows = models.ManyToManyField("self", related_name="followed_by", symmetrical=False, blank=True) def __str__(self): return self.username
内容的提问来源于stack exchange,提问作者reluctant_coder
相关产品推荐
相关产品推荐

