Django中Contact()遇意外关键字参数'listing'报错求助
解决Django TypeError: Contact() got an unexpected keyword argument 'listing'
问题分析
你遇到的错误有两个核心原因:
- 未实例化Contact对象就调用save():代码里直接执行
contact.save(),但根本没有创建Contact类的实例,这会导致后续逻辑完全错误。 - 模型字段不匹配:报错提示
listing不是Contact的合法参数,说明你的Contact模型中没有定义名为listing的字段,但你试图在创建实例时传递这个参数(即使代码逻辑未写全)。
修复步骤
1. 检查Contact模型定义
打开你的models.py,确认Contact模型的字段。比如正确的模型结构可能是这样(假设关联房源的是listing_id字段):
from django.db import models class Contact(models.Model): listing_id = models.IntegerField() name = models.CharField(max_length=200) email = models.EmailField() phone = models.CharField(max_length=20) message = models.TextField(blank=True) user_id = models.IntegerField(blank=True) realtor_email = models.EmailField() # 其他自定义字段...
如果模型里确实没有listing字段,就不要在创建实例时传递这个参数。
2. 修正视图代码
需要先创建Contact实例,再调用save(),同时移除模型中不存在的参数,还要修正函数名和跳转逻辑:
from django.shortcuts import render, redirect from .models import Contact from django.contrib import messages def contact(request): # 避免函数名和模型类名重名,改为小写的contact if request.method == 'POST': listing_id = request.POST['listing_id'] # 移除无用的listing变量,因为模型没有对应字段 name = request.POST['name'] email = request.POST['email'] phone = request.POST['phone'] message = request.POST['message'] user_id = request.POST['user_id'] realtor_email = request.POST['realtor_email'] # 实例化Contact对象,只传递模型中存在的字段 contact = Contact( listing_id=listing_id, name=name, email=email, phone=phone, message=message, user_id=user_id, realtor_email=realtor_email ) contact.save() # 现在可以正常保存数据到数据库 messages.success(request, 'Your request has been submitted, a realtor will get back to you soon') # 修正跳转逻辑,假设urls.py中定义了名为'listing'的URL,接受listing_id参数 return redirect('listing', listing_id) # 处理GET请求的逻辑(根据需求添加) return render(request, 'your_contact_template.html')
额外注意点
- 函数名冲突:原视图函数名
Contact和模型类名重名,会导致代码混淆,建议统一改为小写的contact。 - URL跳转错误:原代码
redirect('listings'+listing_id)写法不符合Django规范,正确写法是redirect('listing', listing_id),需要确保urls.py中已定义对应的带参数URL。
内容的提问来源于stack exchange,提问作者thezeeshann
相关产品推荐
相关产品推荐

