【问题标题】:(Django) Signal isn't working but it works in the shell(Django)信号不工作,但它在外壳中工作
【发布时间】:2020-12-31 02:13:24
【问题描述】:

当创建一个新学生时,我有一个运行 post_save 的信号,该信号通过他们当前注册的课程并为他们分配课程作业的实例(用于评分)。

users/signals.py:

@receiver(post_save, sender=Student)
def save_student_assignments(sender, instance, created, **kwargs):
    if created:
        all_courses = instance.enrolled_courses.all()
        assignments = Assignment.objects.filter(session_link__in=all_courses)
        for assignment in assignments:
            StudentAssignment.objects.create(student=instance, assignment=assignment)

我已经在users/apps.py导入信号了。

如果我在 shell 中运行这个确切的代码,它将创建 StudentAssignment 对象并将它们显示给用户。

我在这里遗漏了什么没有让信号按应有的方式触发?

【问题讨论】:

    标签: python django signals


    【解决方案1】:
    @receiver(post_save, sender=Student)
    def create_student_assignments(sender, instance, created, **kwargs):
            if created:
                all_courses = instance.enrolled_courses.all()
                assignments = Assignment.objects.filter(session_link__in=all_courses)
                for assignment in assignments:
                    StudentAssignment.objects.create(student=instance, assignment=assignment)
    
    @receiver(post_save, sender=Student)
    def save_student_assignments(sender, instance, **kwargs):
        instance.studentassignment.save()
    

    如果外键上有related_name 属性,请将instance.studentassignment.save() 更改为instance.related_name.save()

    这里有教程:https://simpleisbetterthancomplex.com/tutorial/2016/07/28/how-to-create-django-signals.html

    【讨论】:

    • 我不确定 save_student_assignments 在做什么,因为我已经使用了上面的 StudentAssignment.objects.create() 方法。因此,当我创建一个新学生并将他们注册到课程中时,它确实会在数据库中创建它们。如果我进入 django shell 并运行我发布的那些命令,它可以正常工作,并且它们的 StudentAssignment 对象会为它们填充。由于某种原因,它只是没有在信号中触发。
    【解决方案2】:

    我仍然不知道出了什么问题,因为当我创建一个新学生并将他们注册到课程中时,它会注册他们,但是 post_save 从来没有按照我想要的方式运行。然而,我确实得到了一个对我有用的新解决方案:

    而不是这个:

    def create_new_student(request):
        form = NewStudentForm(request.POST)
    
        if form.is_valid():
            form.save()
            messages.success(request, 'Student created!')
        else:
            form = NewStudentForm(request.POST)
        return render(request, 'users/new_student_form.html', {'form': form})
    

    我添加了这个:

    def create_new_student(request):
        form = NewStudentForm(request.POST)
    
        if form.is_valid():
            form.save()
            student = form.cleaned_data['user']
            student=Student.objects.get(user=student)
            all_courses = form.cleaned_data['enrolled_courses'].all()
            assignments = Assignment.objects.filter(session_link__in=all_courses)
            for assignment in assignments:
                StudentAssignment.objects.create(student=student, assignment=assignment)
            messages.success(request, 'Student created!')
        else:
            form = NewStudentForm(request.POST)
        return render(request, 'users/new_student_form.html', {'form': form})
    

    这对我来说有点老套,所以如果有人能弄清楚为什么我的信号之前没有工作,我很乐意清理它,但我知道我需要什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-14
      • 2014-07-28
      • 1970-01-01
      • 2015-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多