首页 > 解决方案 > save() 缺少 1 个必需的位置参数:使用 Django Signal Dispatcher 时出现“self”错误

问题描述

模型.py

class es_event(models.Model):
    #some attributes
    reg_applicants = models.FilePathField(path=None)
    ev_admin =  models.ForeignKey('es_user',related_name='events',on_delete=None)
    slug = models.SlugField(max_length=250)

    def save(self, *args, **kwargs):
        self.slug = slugify(self.ev_name)
        return super(es_event, self).save(*args, **kwargs)

    def get_absolute_url(self):
            return reverse('event_detail', kwargs={'id': self.id, 'slug': self.slug })

视图.py

class CreateEventView(LoginRequiredMixin,CreateView):
    login_url = "/login/"
    model = es_event
    fields = ['ev_name','ev_venue','ev_description','ev_date','registrant_name','registrant_age','registrant_phone','registrant_email','registrant_institution']
    def form_valid(self, form):
        form.instance.ev_admin = self.request.user.es_user
        return super(CreateEventView, self).form_valid(form)

现在,当向 es_event 添加新行时。我想用路径(包括文件名)设置reg_applicants字段

例如:如果es_event.id为 5,则文件名应为Registered_5.csv

为此,我在models.py中创建了这个 Signal

@receiver(post_save, sender=es_event)
def set_csv_path(sender, **kwargs):
    rel_path = "reg_csv/Registered_{}.csv".format(sender.id)
    path = os.path.join(settings.MEDIA_ROOT,rel_path)
    sender.reg_applicants = path
    sender.save()# error statement

这给了我这个错误

save() missing 1 required positional argument: 'self'

我认为信号调度程序函数set_csv_path()有问题。我不知道它是什么

标签: pythondjangodjango-modelsdjango-signals

解决方案


您使用了错误的参数。sender是信号连接到的类。您还需要接受实例参数。

@receiver(post_save, sender=es_event)
def set_csv_path(sender, instance, **kwargs):
    rel_path = "reg_csv/Registered_{}.csv".format(instance.id)
    path = os.path.join(settings.MEDIA_ROOT,rel_path)
    instance.reg_applicants = path
    instance.save()

推荐阅读