python - 在 Django 中,如何立即将组的创建者添加到该组?
问题描述
我正在 Django 中创建一个“社交”应用程序,用户可以在其中创建组(联盟),其他人可以加入这些组。用户资料和联盟通过会员模式连接。我希望这样的组的创建者立即成为它的成员。
我对Django没有经验,其实这是我的第一个项目。但我想这也许可以通过信号来解决?
我的用户个人资料模型:
class Profile(models.Model):
...
user = models.OneToOneField(User, on_delete=models.CASCADE)
alliances = models.ManyToManyField('Alliance', through='Membership')
...
我的联盟模型:
class Alliance(models.Model):
...
name = models.CharField(max_length=10, unique=True)
members = models.ManyToManyField('Profile', through='Membership')
...
我的会员模式:
class Membership(models.Model):
...
profile = models.ForeignKey('Profile', on_delete=models.CASCADE)
alliance = models.ForeignKey('Alliance', on_delete=models.CASCADE)
...
我认为可行的解决方案(使用信号)看起来像这样:
@receiver(post_save, sender=Alliance)
def create_membership(sender, instance, created, **kwargs):
if created:
Membership.objects.create(profile=???, alliance=instance)
'???' 应该是创作者的个人资料。我会很高兴得到任何帮助。
解决方案
信号无法访问触发它的请求,因为它并没有说触发器首先是 HTTP 请求。您可以尝试检查回溯,但这是一个 hacky 解决方案,可能会产生比其价值更多的麻烦。
您需要在创建组的表单或视图中执行此操作。例如,在视图中,您可以使用以下命令添加:
from django.views.generic import CreateView
from django.contrib.auth.mixins import LoginRequiredMixin
from django.http import HttpResponseRedirect
from app.models import Alliance, Membership
class AllianceCreateView(LoginRequiredMixin, CreateView):
model = Alliance
def form_valid(self, form):
self.object = form.save()
Membership.objects.create(
profile=self.request.user.profile,
alliance=self.object
)
return HttpResponseRedirect(self.get_success_url())
请注意,建模很奇怪。通常您不指定两个ManyToManyField
s。Django 会自动添加第二个。因此,您可以在您的Profile
:
class Profile(models.Model):
# ...
user = models.OneToOneField(User, on_delete=models.CASCADE)
alliances = models.ManyToManyField(
'Alliance',
through='Membership',
related_name='members'
)
推荐阅读
- php - 文本文件解析并转换为 JSON?
- mysql - 如何设置mysql存储过程的最大执行时间?
- flutter - 你好。我正在构建一个应用程序,并且试图避免每次启动时都显示我的入职屏幕。我希望每个用户只显示一次
- r - 查找数据集 R 中的所有对
- gitlab - 如何在 Gitlab 中为 Business Central 运行管道?
- pyspark - 如何将带有偏移量的字符串转换为 pyspark 时间戳?
- c# - 如何正确使用 NSDistributedNotificationCenter.DefaultCenter.AddObserver 来监听锁屏事件 C# Mono
- python - 如何为 listView Django 放置 2 个 context_object_name
- r - 如何将 ESGF 中的数据链接到 R 中?
- angular - 从 app.component.ts 获取 url