Django __init__() принимает 1 позиционный аргумент, но было задано 6
Мой класс модели:
class Campaign(models.Model):
name = models.CharField(max_length=255)
campaign_id = models.CharField(max_length=8, null=False, blank=False, unique=True)
def __init__(self):
super(Campaign, self).__init__(self)
self.campaign_id = generate_random_id(8) # it generates just random string
class Meta:
ordering = ["name"]
def __str__(self):
return self.name
Мой класс представления:
def campaign_list(request):
campaigns = Campaign.objects.order_by('name').all()
return render(request, 'mp/campaign/list.html', {'campaigns': campaigns})
Я получил ошибку
init() принимает 1 позиционный аргумент, но было задано 6
До создания init в моей модели все работало нормально. Но я предполагаю, что теперь Campaing.object.all() использует конструктор, а не str. Как я могу опустить это и в .all по-прежнему использовать только обращение к имени, не создавая объект заново?
Оверрайд метода сохранения вместо инициализатора:
class Campaign(models.Model):
name = models.CharField(max_length=255)
campaign_id = models.CharField(max_length=8, unique=True)
def save(self, *args, **kwargs):
self.campaign_id = generate_random_id(8)
super().save(*args, **kwargs)
class Meta:
ordering = ["name"]
def __str__(self):
return self.name
Можно передать *args, **kwargs в качестве аргументов в init.
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) # dont have to pass self
self.campaign_id = generate_random_id(8) # it generates just random string
Вы также можете переопределить метод сохранения
def save(self, *args, **kwargs):
self.campaign_id = generate_random_id(8)
super().save(*args, **kwargs)