(姜戈)信号不起作用,但它在外壳中工作



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

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对象,它们将显示给用户。

我在这里错过了什么,没有让信号像它应该的那样响起?

@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

我仍然不知道出了什么问题,因为当我创建一个新的Student并为他们注册课程时,它会为他们注册,但postrongave从未按照我的意愿运行。然而,我得到了一个对我有效的新解决方案:

取而代之的是:

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

这对我来说有点棘手,所以如果有人能弄清楚为什么我的信号以前不起作用,我很想清理一下,但我找到了我需要的。

最新更新