Django站点首页反馈表单未显示问题排查求助
问题定位&修复方案
1. 表单不渲染核心原因
你在views.py的get方法构造的上下文ctx中,没有把form变量传入模板,模板调用{{ form.as_p }}时拿不到表单对象,自然不会渲染内容。
同时你重写CreateView的get方法存在多处逻辑错误:
- GET请求不需要传入
request.POST构造表单,GET场景只需返回空白表单即可 - 表单验证、保存逻辑不应该写在
get方法中,该部分是POST请求的处理逻辑 - 重复定义了两次
form = ContactForm(request.POST),属于冗余无效代码
2. 其他关联代码错误
models.py问题
- 重复定义了两次
class Meta和两次__str__方法,且第一个__str__为空,会触发语法错误 phone字段错误使用了EmailField类型,会强制校验邮箱格式,用户输入手机号根本无法通过验证verbose_name_plural拼写错误,正确拼写为Feedbacks
forms.py问题
- 代码里的转义字符
"需要替换为正常双引号,否则会触发语法错误
修复后代码参考
views.py
class MainDetail(CreateView): success_url = reverse_lazy('success_page') form_class = ContactForm template_name = 'homepage.html' # 明确指定模板,解决模板找不到的问题 # 用get_context_data扩展上下文,符合类视图规范 def get_context_data(self, **kwargs): ctx = super().get_context_data(**kwargs) ctx['jobs'] = Jobs.objects.order_by() ctx['portfolio'] = Portfolio.objects.prefetch_related('image') return ctx def form_valid(self, form): # 构造发送消息,用cleaned_data拿校验后的数据更安全 data = form.cleaned_data subject = f'来自{data["first_name"]} {data["last_name"]}的消息,主题:ORDER {data["phone"]}' email(subject, data['message']) form.save() return super().form_valid(form)
models.py
class Contact(models.Model): first_name = models.CharField ('Name', max_length=25) last_name = models.CharField('Last Name', max_length=30) phone = models.CharField ('Phone', max_length=15) # 改为CharField适配手机号存储 message = models.TextField (max_length=400) class Meta: verbose_name= 'Feedback' verbose_name_plural = 'Feedbacks' def __str__(self): return self.first_name
forms.py
class ContactForm(ModelForm): class Meta: model = Contact fields = ['first_name', 'last_name', 'phone', 'message'] widgets = { 'first_name': forms.TextInput ( attrs={'placeholder':'Name'} ), 'last_name': forms.TextInput( attrs={'placeholder': 'Wash'} ), 'phone': forms.TextInput( attrs={'placeholder': '+7 (123) 45-67-89'} ), 'message': forms.Textarea( attrs={ 'placeholder': 'Message', "rows":6, "cols": 25 } ) }
验证步骤
修复完成后执行python manage.py makemigrations和python manage.py migrate更新数据库字段,刷新首页即可正常渲染表单。
内容的提问来源于stack exchange,提问作者Ivan W
相关产品推荐
相关产品推荐

