python - 为什么我不能从列表中删除成员并删除他们的兴趣?
问题描述
每篇博文都有自己的成员。要成为会员,您提交的利益必须被接受。我正在尝试构建一个删除成员功能,如果您是成员,则可以将自己从列表中删除,如果您是 blog_post.author,则可以删除除您自己以外的任何人(因为要删除自己,您需要完全删除博客文章.
一旦您从成员列表中删除,我还希望删除他们提交的初始兴趣。我在这个问题中附上了我的 models.py、urls.py、template.html 和 views.py。首先,我没有收到任何错误,但我不确定为什么没有删除兴趣并且也没有删除成员。我的代码有什么问题吗?
所以基本上什么都没有发生,当我按下删除按钮时,我被重定向到我的详细信息页面,如我最后一个视图语句所示。
几种可能:
- 我在模板中错误地查询了 slug
- 我在 views.py 中的 if 和 or 语句是错误的
- 我在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 %}
解决方案
您的类BlogPost
与相关ManyToManyField
,settings.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_id
no ,这可能导致不执行条件:user_id
POST
if
更新你可以试试这个:
from django.contrib.auth import get_user_model
User = get_user_model()
removee= User.objects.get(pk=user_id)
if
并按照上面 Abdul的建议更改声明。
推荐阅读
- android - 如何将前台应用程序设置为不显示在最近列表中?
- spring - 将 Spring Boot 与 ActiveMQ Artemis 和 MQTT 一起使用时出错
- java - Android:使用来自 MediaRecorder 的 getMaxAmplitude(),同时使用来自 TarsosDSP 的 PercussionOnsetDetector
- r - 在 R 中,如何使用 ggplot 或其他东西用数据集(csv 文件)填充地图的颜色?
- python - xx[:,9] 和 xx[:][9] 的区别?
- snowflake-cloud-data-platform - 是否可以使用雪花分割超过 8 GB 的较大文件?
- python - 检查浮点值是否在numpy数组中
- python - 为什么 SciPy 的 ODE 求解器不能产生正确的解?
- spring-boot - spring boot rest api调用
- sip - SIP INVITE 消息中的 INVITE 字段和 To 字段有什么区别?