save () отсутствует 1 обязательный позиционный аргумент: ошибка «self» при использовании Django Signal Dispatcher - PullRequest
0 голосов
/ 21 июня 2019

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

@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 () . Я не знаю что это такое

1 Ответ

1 голос
/ 21 июня 2019

Вы используете неправильный параметр.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()
...