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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 23:15:00