在 Django 中,如何立即将组的创建者添加到该组?
In Django, how to add creator of a group to that group instantly?
我正在 Django 中创建一个 'social' 应用程序,用户可以在其中创建组(联盟),其他人可以加入这些组。用户 Profiles 和 Alliances 通过 Membership 模型连接。 我希望此类群组的创建者立即成为其中的成员。
我对 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 请求。您可以尝试检查回溯,但这是一个棘手的解决方案,可能会产生比其价值更多的麻烦。
您需要在创建群组的 表单 或 视图 中执行此操作。例如在视图中,您可以添加:
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.<b>create(</b>
profile=self.request.user.profile,
alliance=self.object
<b>)</b>
return HttpResponseRedirect(self.get_success_url())
请注意,建模非常奇怪。通常你 而不是 指定两个 ManyToManyField
。 Django 会自动添加第二个。因此,您可以在 Profile
:
中指定
class Profile(models.Model):
# ...
user = models.OneToOneField(User, on_delete=models.CASCADE)
alliances = models.ManyToManyField(
'Alliance',
through='Membership',
<b>related_name='members'</b>
)
我正在 Django 中创建一个 'social' 应用程序,用户可以在其中创建组(联盟),其他人可以加入这些组。用户 Profiles 和 Alliances 通过 Membership 模型连接。 我希望此类群组的创建者立即成为其中的成员。
我对 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 请求。您可以尝试检查回溯,但这是一个棘手的解决方案,可能会产生比其价值更多的麻烦。
您需要在创建群组的 表单 或 视图 中执行此操作。例如在视图中,您可以添加:
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.<b>create(</b>
profile=self.request.user.profile,
alliance=self.object
<b>)</b>
return HttpResponseRedirect(self.get_success_url())
请注意,建模非常奇怪。通常你 而不是 指定两个 ManyToManyField
。 Django 会自动添加第二个。因此,您可以在 Profile
:
class Profile(models.Model):
# ...
user = models.OneToOneField(User, on_delete=models.CASCADE)
alliances = models.ManyToManyField(
'Alliance',
through='Membership',
<b>related_name='members'</b>
)