【问题标题】:save() missing 1 required positional argument: 'self' Error while using Django Signal Dispatchersave() 缺少 1 个必需的位置参数:使用 Django Signal Dispatcher 时出现“self”错误
【发布时间】:2019-11-04 13:01:55
【问题描述】:

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

views.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() 有问题。不知道是什么

【问题讨论】:

    标签: python django django-models django-signals


    【解决方案1】:

    您使用了错误的参数。 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()
    

    【讨论】:

    • 我已经尝试过了,但是我收到了这个错误调用 Python 对象时超出了最大递归深度
    • 好吧,现在想想你在处理程序中做了什么:你正在调用 save。它将调用保存后处理程序,它调用保存...实际上这应该在 pre-save 处理程序中,您不应该在其中调用保存。
    • 我认为我的 CreateEventView 中的这一行存在一些问题 return super(es_event, self).save(*args, **kwargs)
    • 正如我所说,您不应该在处理程序中调用 save。
    • 如果我使用pre_save,那么instance.id将为None,实例的id只有保存后才可用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 2017-07-27
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    相关资源
    最近更新 更多