首页 > 解决方案 > 为什么我不能从列表中删除成员并删除他们的兴趣?

问题描述

每篇博文都有自己的成员。要成为会员,您提交的利益必须被接受。我正在尝试构建一个删除成员功能,如果您是成员,则可以将自己从列表中删除,如果您是 blog_post.author,则可以删除除您自己以外的任何人(因为要删除自己,您需要完全删除博客文章.

一旦您从成员列表中删除,我还希望删除他们提交的初始兴趣。我在这个问题中附上了我的 models.py、urls.py、template.html 和 views.py。首先,我没有收到任何错误,但我不确定为什么没有删除兴趣并且也没有删除成员。我的代码有什么问题吗?

所以基本上什么都没有发生,当我按下删除按钮时,我被重定向到我的详细信息页面,如我最后一个视图语句所示。

几种可能:

  1. 我在模板中错误地查询了 slug
  2. 我在 views.py 中的 if 和 or 语句是错误的
  3. 我在views.py 中的try 语句是错误的

模型.py

class Account(AbstractBaseUser):
 email                  = models.EmailField(verbose_name="email", max_length=60, unique=True)
 username               = models.CharField(max_length=30, unique=True)

class BlogPost(models.Model):
 title                  = models.CharField(max_length=50, null=False, blank=False, unique=True)
 author                     = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
 slug                   = models.SlugField(blank=True, unique=True)
 members    = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True, related_name="members")

class Interest(models.Model):
   user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
   blog_post = models.ForeignKey(BlogPost, on_delete=models.CASCADE)

class InterestInvite(models.Model):

   ACCEPT = "ACCEPT"
   DECLINE = "DECLINE"
   PENDING = "PENDING"
   STATUS_CHOICES = [
      (ACCEPT, "accept"),
      (DECLINE, "decline"),
      (PENDING, "pending"),

   ]

   interest = models.OneToOneField(Interest, on_delete=models.CASCADE, related_name="interest_invite")   
   status = models.CharField(max_length=25, choices=STATUS_CHOICES, default=PENDING)

视图.py

class InterestMixin(object):
    model=Interest

class BlogPostMixin(object):
    model=BlogPost

class MemberListView(UserPassesTestMixin, BlogPostMixin, DetailView):
    template_name = "HomeFeed/membersof_yourpost.html"
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        blog_post=self.get_object()
        context['blog_post'] = blog_post
        return context


def remove_member_view(request, slug):
    user = request.user
    blog_post = get_object_or_404(BlogPost, slug=slug)
    if request.method == "POST":
        user_id = request.POST.get("user_id")
        if (user_id == user.pk and blog_post.members.filter(pk=user.pk).exists()) or (blog_post.author == request.user and user.pk != user_id):
            try:
                removee = Account.objects.get(pk=user_id)
                blog_post.members.remove(removee)
                Interest.objects.filter(user=removee, blog_post=blog_post).delete()
            except Account.DoesNotExist:
                pass
    return redirect('HomeFeed:detail', slug=slug)


网址.py

    path('<user_id>/', account_view, name="view"),
    path("blog/<pk>/<slug>/member-list/", MemberListView.as_view(), name="member_list"),
    path("removemember/<slug>/", remove_member_view, name="remove_member"),

成员.html

    {% for member in object.members.all %}
    {% if member == request.user %}
    <li class="text-center"><a class="btn btn-info btn-sm mt-3 mb-3" href="{% url 'account:view' member.pk %}">This is you</a></li>
    {% else %}
    <li class="text-center"><a class="btn btn-primary btn-sm mt-3 mb-3" href="{% url 'account:view' member.pk %}">{{member.username}}</a></li>
    {% endif %}

        <form method="POST" action="{% url 'HomeFeed:remove_member' object.slug %}">
            {% csrf_token %}
            <button class="btn btn-sm btn-danger">Remove</button>
        </form> 


    {% endfor %}

标签: pythondjangodjango-viewsdjango-formsdjango-templates

解决方案


您的类BlogPost与相关ManyToManyFieldsettings.AUTH_USER_MODEL但在您的remove_member_view函数中,您使用Account.

if (user_id == user.pk and blog_post.members.filter(pk=user.pk).exists()) or (blog_post.author == request.user and user.pk != user_id):
            try:
                removee = Account.objects.get(pk=user_id) #<== here
                blog_post.members.remove(removee)
                Interest.objects.filter(user=removee, blog_post=blog_post).delete()
            except Account.DoesNotExist:
                pass

此外,我不明白 的目的是什么,在要与请求一起发送的 html 中显示user_idno ,这可能导致不执行条件:user_idPOSTif

更新你可以试试这个:

from django.contrib.auth import get_user_model

User = get_user_model()

removee= User.objects.get(pk=user_id)

if并按照上面 Abdul的建议更改声明。


推荐阅读