首页 > 其他分享 >Django系统报错总结 1

Django系统报错总结 1

时间:2023-09-02 10:56:35浏览次数:42  
标签:总结 __ Product models ProductForm product Django forms 报错

Django系统报错总结 1

  本章节,继续总结前面商品系统编写中遇到的报错问题

TypeError: Product() got unexpected keyword arguments: 'update_time', 'seller'

因为在Product类中没有定义参数update_time和seller。要解决这个问题,你需要确保在Product类中添加这些参数的定义。

## 定义的创建一个新的商品实例
new_product = Product(
    name=name,
    price=price,
    description=description,
    created_time=created_time,
    update_time=update_time,
    photo=photo,
    video=video,
    seller=request.user
)

#因为在Product()构造函数中有未预期的关键字参数'update_time'和'seller'。解决方法是检查Product类的构造函数,确保它接受这些参数。如果没有,可以添加相应的参数来修复这个错误
from django.db import models

class Product(models.Model):
    name = models.CharField(max_length=200)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    description = models.TextField()
    created_time = models.DateField(auto_now_add=True)
    updated_time = models.DateTimeField(auto_now=True)
    photo = models.ImageField(upload_to='product_photos/', blank=True)
    video = models.FileField(upload_to='product_videos/', blank=True)

    def __str__(self):
        return self.name

# 在创建Product对象时指定seller和update_time
def add_product(request):
    ...
    创建一个新的商品实例
        new_product = Product(
            name=name,
            price=price,
            description=description,
            created_time=created_time,
            photo=photo,
            video=video,
        )

        new_product.seller = request.user
        new_product.updated_time = datetime.now()
        form = ProductForm(request.POST, request.FILES, instance=new_product)

报错decimal.InvalidOperation: [<class 'decimal.ConversionSyntax'>]

这个错误是由于Decimal构造函数的参数不是一个有效的数字表示引起的。为了解决这个错误,需要确保传递给Decimal构造函数的参数是一个有效的数字字符串或数字类型。

在这段更新后的代码中,我们从“decimal”模块导入了“InvalidOperation”异常,并在“except”块中使用它。这可确保在转换为Decimal失败时正确捕获和处理异常。

try:
    price = Decimal(price)
    logger.info('用户%s输入价格%s为数字' % (request.user.username, price))
    messages.info(request, '价格设置成功')
except ValueError:
    messages.error(request, '价格必须为数字!')
    logger.error('用户%s尝试添加价格非数字商品' % request.user.username)
    return redirect('add_product')

#修改为
from decimal import Decimal, InvalidOperation

try:
    price = Decimal(price)
    logger.info('用户%s输入价格%s为数字' % (request.user.username, price))
    messages.info(request, '价格设置成功')
except InvalidOperation:
    messages.error(request, '价格必须为数字!')
    logger.error('用户%s尝试添加价格非数字商品' % request.user.username)
    return redirect('add_product')

init TypeError: init() got an unexpected keyword argument 'instance'

 确保在导入表单时正确导入。您可以尝试使用而不是。然后,删除参数,因为默认会处理模型实例

#报错代码
form = ProductForm(request.POST, request.FILES, instance=new_product)

#解决如下
from django import forms
from .models import Product

class ProductForm(forms.ModelForm):
    class Meta:
        model = Product
        fields = '__all__'

#使用ProductForm不带instance参数来实例化表单
form = ProductForm(request.POST, request.FILES)

form.save() AttributeError: 'ProductForm' object has no attribute 'save'

form.save() AttributeError: 'ProductForm' object has no attribute 'save'这个错误通常是因为表单对象没有定义 save() 方法。您可以检查以下内容:

  1. 确保您的表单类继承自 forms.ModelForm 或 forms.Form。
  2. 确保您在表单类中定义了 save() 方法。

ProductForm 继承自 forms.ModelForm,并定义了一个简单的 save() 方法,该方法将创建一个新的 Product 对象并保存它。

from django import forms
from .models import Product

class ProductForm(forms.ModelForm):
    class Meta:
        model = Product
        fields = ['name', 'description', 'price']

    def save(self, commit=True):
        product = super(ProductForm, self).save(commit=False)
        if commit:
            product.save()
        return product

AttributeError: 'super' object has no attribute 'save'

product = super(ProductForm, self).save(commit=False)

AttributeError: 'super' object has no attribute 'save'

这个错误通常是由于调用 super() 函数时未正确指定父类。您可以检查以下内容:

  1. 确保您的表单类继承自 forms.ModelForm 或 forms.Form。
  2. 确保您在表单类中正确地调用了 super() 函数。

ProductForm 继承自 forms.ModelForm,并定义了一个简单的 save() 方法,该方法将创建一个新的 Product 对象并保存它

from django import forms
from .models import Product

class ProductForm(forms.ModelForm):
    class Meta:
        model = Product
        fields = ['name', 'description', 'price']

    def save(self, commit=True):
        product = super(ProductForm, self).save(commit=False)
        if commit:
            product.save()
        return product

ValueError: MultiFileInput doesn't support uploading multiple files.

报错代码如下: ValueError: MultiFileInput doesn't support uploading multiple files.

from django import forms
from .models import Product

class MultiFileInput(forms.FileInput):
    def __init__(self, attrs=None):
        super().__init__(attrs={'multiple': True, **(attrs or {})})

    def render(self, name, value, attrs=None, renderer=None):
        if value is None:
            value = []
        final_attrs = self.build_attrs(attrs, type=self.input_type, name=name)
        if value != []:
            final_attrs.update({'multiple': 'multiple'})

class ProductForm(forms.ModelForm):
    class Meta:
        model = Product
        fields = '__all__'
        widgets = {
            'photo': MultiFileInput(),
            'video': MultiFileInput(),
        }

这个错误可能是因为您的Django版本不支持在render()方法中使用multiple属性。可以将multiple属性添加到self.attrs中,而不是在render()方法中添加。

将multiple属性添加到了小部件的初始化方法中。然后,在表单的__init__()方法中,我们将multiple属性添加到了小部件的属性中,以便在渲染表单时正确显示多个文件上传控件。

from django import forms
from .models import Product

class MultiFileInput(forms.FileInput):
    def __init__(self, attrs=None):
        super().__init__(attrs={'multiple': True, **(attrs or {})})

class ProductForm(forms.ModelForm):
    class Meta:
        model = Product
        fields = '__all__'
        widgets = {
            'photo': MultiFileInput(),
            'video': MultiFileInput(),
        }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['photo'].widget.attrs.update({'multiple': 'multiple'})
        self.fields['video'].widget.attrs.update({'multiple': 'multiple'})

django-multiupload库解决

上述方法若还是报错,可使用第三方库
可能是因为您使用的Django版本不支持在render()方法中使用multiple属性。为了解决这个问题,您可以尝试使用一个第三方库,例如django-multiupload,它提供了对多文件上传的支持。
使用django-multiupload库的示例:
使用了MultiFileField来替代原来的照片和视频字段。您可以根据实际需求设置最小和最大文件数量以及最大文件大小。
请注意,使用第三方库可能会导致一些额外的配置和调整。请参考django-multiupload的文档以获取更多详细信息和用法示例。

安装django-multiupload库:

 pip install django-multiupload  

settings.py文件中添加multiupload到INSTALLED_APPS:

INSTALLED_APPS = [
# ...
'multiupload',
]

表单中使用MultiFileField

from django import forms
from multiupload.fields import MultiFileField
from .models import Product

class ProductForm(forms.ModelForm):
    photos = MultiFileField(min_num=1, max_num=10, max_file_size=1024*1024*5)  # 设置最小和最大文件数量以及最大文件大小

    class Meta:
        model = Product
        fields = '__all__'

TypeError: __init__() missing 1 required positional argument: 'to'

photo = models.ManyToManyField(upload_to='product_photos/', blank=True)
TypeError: __init__() missing 1 required positional argument: 'to'
这个错误是由于ManyToManyField的to参数缺失导致的。你需要在ManyToManyField中指定关联的模型类作为to参数的值。
解决方法是在ManyToManyField的to参数中提供关联的模型类。例如,如果关联的模型类名为Product,则可以将to参数设置为to='Product'

 
photo = models.ManyToManyField(upload_to='product_photos/', blank=True)

#修改为
photo = models.ManyToManyField('Product', upload_to='product_photos/', blank=True)

报错个人总结

  上面仅仅只是一部分报错,在编写功能的时候出现的状况问题更多,在这里总结几点我认为有效的建议。

1、先确定构思所需要的功能,大概的框架先想好构思

2、编写注释,在将构思落实之前先写好注释,再在每个功能里面写好注释怎么去完成这个功能

3、一个功能完成,立即去测试验证能否实现要求的场景功能

4、不要钻牛角尖,在这个问题实在解决不了的情况,可以换个思路去解决,等完全实现了在去研究之前的问题出现在哪。不能一直卡在一个问题

 5、很多时候报错有以下几点导致的: 
  •   新写的代码语法或逻辑有问题
  •   没有导入所引入的模块
  •   代码多出或缺少字符
  •   模版中引用代码的参数不匹配

6、对于代码的功能优化和页面优化,可以本着先实现,再优化。可以通过Google,GPT帮我们锦上添花。

 

标签:总结,__,Product,models,ProductForm,product,Django,forms,报错
From: https://www.cnblogs.com/weiweirui/p/17673310.html

相关文章

  • Oracle - 运维相关总结
    读写分离读写分离的重点其实就是数据同步,能实现数据实时同步的技术很多。基于日志的Oracle复制技术,Oracle自身组件可以实现,同时也有成熟的商业软件。选商业的独立产品还是Oracle自身的组件功能,这取决于多方面的因素。比如团队的相应技术运维能力、项目投入成本、业务系统的负......
  • @Test 报错
    问题:使用jdbc事务连接数据库时,用到@Test进行测试,一直爆红。解决:1.快捷键:Alt+Enter,查看错误原因,无法导入junit4依赖;2.在file-->ProjectStructure中引入Junit4依赖  在第(2.3)个步骤中导入idea中lib下的jar包3.最后点击apply,使用。补充:问题:手动添加完依赖后,idea......
  • django+drf开发一些个人的标准化
    最近在改造一下个人的开发风格。特分享一下。子应用我一般放在apps中,每个不同模块的子应用起不同的名字。startapp后自己移动一下,记得修改一下Appconfig中的name即可。子应用中创建services.py或者如有需要可以创建services模块再细分。所有业务放到services中编写。views一律......
  • Oracle - 常见函数总结
    to_date()字符串转日期selectto_date('20050101','yyyyMMdd')todayfromdualto_char()将数值或日期型转化为字符selectto_char(12345678,'999,999,999,999')fromdual;selectto_char(sysdate,'yyyy-MM-dd')fromdual;to_number()......
  • 第八周总结
    本周我着重复习了Hadoop的相关知识,并对以下几个方面进行了总结和学习: 1.Hadoop基本概念和架构:我回顾了Hadoop生态系统的基本概念和架构。我了解了Hadoop的两个核心组件:Hadoop分布式文件系统(HDFS)和MapReduce计算模型。我学习了Hadoop的分布式架构,包括主节点(NameNode)和数据节点(Da......
  • MySQL binlog日志总结
    概念描述binlog日志:binlog日志用于记录所有更新了数据或者已经潜在更新了数据(例如,没有匹配任何行的一个DELETE)的所有语句。语句以“事件”的形式保存,它描述数据更改。binlog可用于实时备份,主从复制master->slave的数据同步。知识总结binlog相关参数:log_bin:#开启binlog参数,可以指定......
  • 8月总结
    MySQL是一种常用的关系型数据库管理系统,提供了许多函数和技巧来处理和操作数据。以下是一些常用的MySQL函数和技巧的总结:常用函数:SELECT函数:COUNT():计算满足条件的行数。SUM():计算指定列的总和。AVG():计算指定列的平均值。MIN():找出指定列的最小值。MAX():找出指定列......
  • Word2Vec模型总结
    1.Huffman树的构造解析:给定n个权值作为n个叶子节点,构造一棵二叉树,若它的带权路径长度达到最小,则称这样的二叉树为最优二叉树,也称Huffman树。数的带权路径长度规定为所有叶子节点的带权路径长度之和。Huffman树构造,如下所示:(1)将看成是有n颗树的森林;(2)在森林中选出两个根节点的权值......
  • uniapp项目实践总结(六)自定义顶部导航栏
    本篇主要讲述如何自定义顶部导航栏,有时候默认导航栏不足以满足我们的需求,这时候就需要自定义导航栏来解决这个问题。目录默认导航修改配置自定义顶部默认导航自带的默认顶部导航设置的内容有限,不容易扩展修改,因此如果有更加个性化的需求,则需要自定义顶部导航。配置如下......
  • (持续更新)CF赛后失误总结
    在CF上比赛中反映出的问题总结目录在CF上比赛中反映出的问题总结总是存在的问题:EducationalCodeforcesRound154(8.31)结果(+164)总结:PinelyRound2(8.30)结果:(+231)总结:(找性质)更早以前:总是存在的问题:总想把前面的做对,浪费了宝贵的时间AC后面的EducationalCodeforcesRound......