【问题标题】:TypeError save() takes at least 2 arguments (1 given)TypeError save() 至少需要 2 个参数(给定 1 个)
【发布时间】:2015-08-31 06:41:33
【问题描述】:

我在 Django 项目中出现类型错误 save() 至少需要 2 个参数(给定 1 个)这样的错误。

查看.py文件

class DealsForm(ModelForm):
    class Meta:
        model = Product
        fields = ['title','description','category','price','sale_price','slug','active','update_defaults','user']
        exclude = ('user',)

model.py 文件

class Product(models.Model):
    title = models.CharField(max_length=120)
    description = models.TextField(null=True, blank=True,max_length=200)
    category = models.ManyToManyField(Category, null=True, blank=True)
    price = models.DecimalField(decimal_places=2, max_digits=100, default=29.99)
    sale_price = models.DecimalField(decimal_places=2, max_digits=100,\
                                            null=True, blank=True)
    slug = models.SlugField(unique=True)
    timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)
    updated = models.DateTimeField(auto_now_add=False, auto_now=True)
    active = models.BooleanField(default=True)
    update_defaults = models.BooleanField(default=False)
    user = models.ForeignKey(User)   

    def __unicode__(self):
        return self.title

    class Meta:
        unique_together = ('title', 'slug')

    def get_price(self):
        return self.price

    def get_absolute_url(self):
        return reverse("single_product", kwargs={"slug": self.slug})

    def save(self, request, *args, **kwargs):
        obj = super(DealsForm, self).save(commit=False, *args, **kwargs)
        obj.user = request.user 
        obj.save() 

你能解决这个问题吗?

【问题讨论】:

  • 请发布完整的堆栈跟踪。

标签: django django-models django-forms


【解决方案1】:

调用.save() 时,您似乎没有传递request 对象。您还需要根据save() 的定义传递request 对象。

另外,请检查您的 .save() 函数,因为您在 Product 模型类中使用 DealsForm 类参数调用 super()

编辑:

由于您只想在product 对象上设置user,您可以改为执行以下操作:

def my_view(request):
    ...
    product = my_deals_form.save(commit=False) # get the product instance
    product.user = request.user # set the user on the product
    product.save() # save the object     

您不需要重写save() 方法。只需使用commit=False 参数调用模型表单实例,将用户设置为product 对象,然后保存该对象。

【讨论】:

  • 我放了那个代码,但仍然得到那个错误 def save(self, request, *args, **kwargs): obj = super(DealsForm, self).save(commit=False, *args, **kwargs) obj.user = request.user obj.save(request)
  • 你为什么在Product类中打电话给super(DealsForm, ?该代码应该在DealsForm 类中。
  • 更新了 ans 以包含代码。希望对您有所帮助。
猜你喜欢
  • 1970-01-01
  • 2017-12-29
  • 1970-01-01
  • 1970-01-01
  • 2012-10-08
  • 2017-05-10
  • 2013-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多