【问题标题】:Why can't I remove the member from the list and delete their interest?为什么我不能从列表中删除成员并删除他们的兴趣?
【发布时间】:2021-01-27 04:38:53
【问题描述】:

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

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

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

可能性很小:

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

models.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)

views.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)


urls.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"),

members.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 %}

【问题讨论】:

  • 我在您的表单中没有看到类似user_id 的内容。您如何期望它最终出现在您的 POST 参数中?

标签: python django django-views django-forms django-templates


【解决方案1】:

您没有在您的视图中发布任何user_id。试试这个:
在您的模板中:

<form method="POST" action="{% url 'HomeFeed:remove_member' object.slug %}">
    {% csrf_token %}
    <input type="number" name="user_id" value="{{ member.id }}" hidden>
    <button class="btn btn-sm btn-danger">Remove</button>
</form>

在您看来条件有点错误,将其更改为:

if blog_post.author.id != user_id and blog_post.members.filter(pk=user_id).exists() and (user_id == user.pk or blog_post.author == user)

【讨论】:

  • 嗨,阿卜杜勒,谢谢!我会试试这个并回复你:)
【解决方案2】:

您的课程BlogPostManyToManyFieldsettings.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

另外,我不明白user_id的目的是什么,没有user_id在html中显示为与POST请求一起发送,这可能导致不执行if条件:

更新你可以试试这个:

from django.contrib.auth import get_user_model

User = get_user_model()

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

并按照上面 Abdul 的建议更改 if 语句。

【讨论】:

  • 当然,根据您的意见,您能否建议我学习和编辑的代码:)
猜你喜欢
  • 2010-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多