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等关键字参数时会触发参数不匹配错误。
解决方法
任选以下一种方案即可:
- 重命名视图函数:将视图函数名改为
add_news或news_view等,避免与模型类名冲突,示例:def news_view(request): # 原视图逻辑保持不变 - 导入模型时使用别名:在views.py的导入语句中给模型类起别名,避免名称冲突,示例:
from .models import news as NewsModel # 实例化时使用别名 newsData = NewsModel(dbemail=email, dbsubject=subject, dbdetail=detail, dbimage=uploaded_file_url) - 遵循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
相关产品推荐
相关产品推荐

