You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django实例化news模型触发TypeError:意外关键字参数'dbemail'

Django 4.2.1 TypeError: news() got an unexpected keyword argument 'dbemail'

错误触发场景

开发Django 4.2.1项目时,访问/news路径提交POST请求,触发TypeError,错误提示news() got an unexpected keyword argument 'dbemail',错误发生在实例化news模型的代码行:

newsData = news(dbemail = email, dbsubject = subject, dbdetail = detail, dbimage = uploaded_file_url)

模型代码

class news(models.Model):
    dbemail = models.CharField(max_length=100)
    dbsubject = models.CharField(max_length=300)
    dbdetail = models.CharField(max_length=5000)
    dbimage = models.CharField(max_length=100)
    dbdatetime = models.DateTimeField(auto_now_add=True)
    
    def __str__(self):
        return "Email: " + self.dbemail + " | Subject: " + self.dbsubject + " | datetime: " + self.dbdatetime

视图函数代码

def news(request):
    if 'email' in request.session:
        email = request.session['email']
        if request.method == 'POST' and request.FILES['newsimage']:
            myfile = request.FILES['newsimage']
            fs = FileSystemStorage(location='newsimages/')
            filename = fs.save(myfile.name, myfile)
            uploaded_file_url = fs.url(filename)

            newsinfo = newsForm(request.POST)
            if newsinfo.is_valid():
                subject = newsinfo.cleaned_data['subject']
                detail = newsinfo.cleaned_data['detail']
                newsData = news(dbemail = email, dbsubject = subject, dbdetail = detail, dbimage = uploaded_file_url)
                newsData.save()
                message = "News has been added"
                form = newsForm()
                return render(request, 'news.html', {
                    'myform': form,
                    'message': message
                })

        else:
            form = newsForm()
            return render(request, 'news.html', {'myform': form})
    else:
        request.session['profileError'] = "You have to sign up or log in first!"
        return redirect('login')

错误详情

TypeError at /news
news() got an unexpected keyword argument 'dbemail'
Request Method: POST
Request URL:    http://localhost:8000/news
Django Version: 4.2.1
Exception Type: TypeError
Exception Value:    
news() got an unexpected keyword argument 'dbemail'
Exception Location: C:\Users\farib\Desktop\Python\finalproject\main\views.py, line 105, in news
Raised during:  main.views.news

问题原因与解决方法

核心原因

视图函数名称news与模型类名称完全一致,在视图函数内部作用域中,Python会优先将news解析为当前定义的视图函数(仅接受request参数),而非导入的模型类,因此传入dbemail等关键字参数时会触发参数不匹配错误。

解决方法

任选以下一种方案即可:

  1. 重命名视图函数:将视图函数名改为add_news或news_view等,避免与模型类名冲突,示例:
    def news_view(request):
        # 原视图逻辑保持不变
    
  2. 导入模型时使用别名:在views.py的导入语句中给模型类起别名,避免名称冲突,示例:
    from .models import news as NewsModel
    # 实例化时使用别名
    newsData = NewsModel(dbemail=email, dbsubject=subject, dbdetail=detail, dbimage=uploaded_file_url)
    
  3. 遵循PEP8规范重命名模型类:将模型类名改为大驼峰格式News(Django开发通用规范),同时调整视图中实例化代码,从根源避免命名冲突:
    # 模型类重命名
    class News(models.Model):
        # 字段定义不变
        
    # 视图中实例化
    newsData = News(dbemail=email, dbsubject=subject, dbdetail=detail, dbimage=uploaded_file_url)
    

额外注意点

模型的__str__方法存在字符串拼接错误:self.dbdatetime是DateTimeField对象,无法直接与字符串拼接,会触发另一个类型错误,建议修改为格式化字符串:

def __str__(self):
    return f"Email: {self.dbemail} | Subject: {self.dbsubject} | datetime: {self.dbdatetime}"

内容的提问来源于stack exchange,提问作者Fariborz S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 11:39:55