Django ModelForm配置正常却无法渲染表单字段问题求助
Django ModelForm无法渲染问题排查及解决方案
根本原因
表单无法渲染的核心问题是视图传递的上下文变量名与模板调用的变量名不匹配,除此之外代码中还有多处缩进错误、语法错误会引发后续功能异常,完整修复方案如下:
具体修复步骤
1. 统一上下文与模板的变量名
views.py中定义的上下文字典key为forms,但模板中调用的变量是form,两者名称不一致导致Django模板找不到表单实例,直接将views.py中的上下文定义修改为:
也可以修改模板调用语句为context = {'form': form}{{ forms|crispy }},只要两边变量名保持一致即可。2. 修复forms.py的缩进与语法错误
当前clean_Producer_Email方法缩进层级错误,不属于AppsForm类,自定义校验规则不会生效,同时返回值变量名拼写错误,可直接替换为以下优化后的代码:from django import forms from django.core.exceptions import ValidationError from django.forms import ModelForm from .models import Appear class AppsForm(ModelForm): class Meta: model = Appear fields = '__all__' # 方法缩进一层,放到表单类内部 def clean_Producer_Email(self): Producer_Email = self.cleaned_data.get('Producer_Email') if not Producer_Email: raise forms.ValidationError('该字段不能为空') # 替换遍历所有实例的低性能写法 if Appear.objects.filter(Producer_Email=Producer_Email).exists(): raise forms.ValidationError('该邮箱已存在,请填写其他邮箱') # 修正拼写错误的返回值变量名 return Producer_Email3. 修复models.py的缩进与方法适配问题
当前Appear类下的字段和魔术方法都没有正确缩进,Django无法识别为模型属性,会导致表单生成失败,同时Django 3.x及以上版本需要将__unicode__方法替换为__str__方法,修改后的代码如下:from django.db import models Media_Choices = ( ("TV", "TV"), ("Radio", "Radio"), ("Youtube", "Youtube"), ("Podcast", "Podcast"), ) class Appear(models.Model): # 所有字段缩进一层,放到类内部 Show = models.CharField(max_length=100) Media = models.CharField(max_length=30, blank=True, null=True, choices=Media_Choices) Episode = models.IntegerField() Date = models.DateField(max_length=100) Time = models.TimeField(auto_now=False, auto_now_add=False) Producer = models.CharField(max_length=100) Producer_Email = models.EmailField(max_length=254) # 方法缩进一层,Django3+替换为__str__ def __str__(self): return self.Show + ' ' + self.Producer_Email
完成以上修改后重启服务即可正常渲染表单字段。
内容的提问来源于stack exchange,提问作者Houston Khanyile
相关产品推荐
相关产品推荐

