【发布时间】:2021-01-27 04:38:53
【问题描述】:
每篇博文都有自己的成员。要成为会员,您提交的利益必须被接受。我正在尝试构建一个删除成员功能,如果您是成员,则可以将自己从列表中删除,如果您是 blog_post.author,则可以删除除您自己以外的任何人(因为要删除自己,您需要完全删除博客文章.
一旦您从成员列表中删除,我还希望删除他们提交的初始兴趣。我在这个问题中附加了我的 models.py、urls.py、template.html 和 views.py。首先,我没有收到任何错误,但我不确定为什么没有删除兴趣并且也没有删除成员。我的代码有什么问题吗?
所以基本上什么都没有发生,当我按下删除按钮时,我会被重定向到我的详细信息页面,如我最后一个视图语句所示。
可能性很小:
- 我在模板中错误地查询了 slug
- views.py 中的 if 和 or 语句是错误的
- 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