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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 23:40:21