Python 在Django中,如何立即将组的创建者添加到该组中?

Python 在Django中,如何立即将组的创建者添加到该组中?,python,django,signals,Python,Django,Signals,我正在Django中创建一个“社交”应用程序,用户可以在其中创建组(联盟),其他人也可以加入这些组。用户配置文件和联盟通过成员模型连接我希望这类小组的创建者立即成为其中的一员。 我在Django没有经验,事实上,这是我的第一个项目。但我想这也许可以通过信号来解决 我的用户配置文件模型: class Profile(models.Model): ... user = models.OneToOneField(User, on_delete=models.CASCADE) a

我正在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请求。您可以尝试检查回溯,但这是一个黑客解决方案,可能会产生更多的麻烦

您需要在创建组的窗体或视图中执行此操作。例如,在视图中,可以添加以下内容:

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())

信号无法访问触发它的请求,因为首先并没有说触发器是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.create(
            profile=self.request.user.profile,
            alliance=self.object
        )
        return HttpResponseRedirect(self.get_success_url())

我想你应该在表格里写。一个信号不能访问一个请求,因为它不是说创建一个组首先是通过一个请求完成的。这可能需要在视图中完成。显示创建这个的视图。我想你应该在表单中这样做。一个信号不能访问一个请求,因为它不是说创建一个组首先是通过一个请求完成的。这可能需要在视图中完成。显示创建此视图的视图。我发现我一直在错误地思考它。你的方法非常有效。另外,谢谢你的额外建议!我知道我一直想错了。你的方法非常有效。另外,谢谢你的额外建议!