Django表单报错:'RecordSearchForm'无'is_game'属性,求排查
问题分析与解决方案
核心错误点及修复说明
表单字段值访问方式错误
Django表单的字段值不能通过form.is_game直接访问,必须先调用form.is_valid()完成表单验证,再从cleaned_data字典中获取对应值——这是Django表单处理的标准流程,未验证的表单cleaned_data为空,直接访问字段属性会触发属性不存在的错误。模型管理器调用错误
你实例化了模型对象(如game_data = GameDataEntry()),然后尝试通过game_data.objects.filter查询数据。但objects是模型类的管理器属性,只能通过模型类(GameDataEntry)直接调用,不能通过模型实例调用。BooleanField未设置可选
你的复选框字段默认required=True,如果用户未勾选会导致表单验证失败,必须添加required=False让这些复选框成为可选字段。字段名大小写不一致
表单中is_Progress的大写P容易引发拼写错误,建议统一为小写(如is_progress),保持代码风格一致性。
修正后的表单类代码
class RecordSearchForm(forms.Form): # 统一小写字段名,添加required=False标记为可选 is_progress = forms.BooleanField( widget=forms.CheckboxInput(attrs={'class': 'form-check-input', "id": "is_progress_update"}), required=False ) is_game = forms.BooleanField( widget=forms.CheckboxInput(attrs={'class': 'form-check-input', "id": "is_game_update"}), required=False ) is_work = forms.BooleanField( widget=forms.CheckboxInput(attrs={'class': 'form-check-input', "id": "is_work_entry"}), required=False ) game_name = forms.ModelChoiceField( widget=forms.Select(attrs={'class': 'form-control', "id": "game_name"}), queryset=Games.objects.all() ) entry_date = forms.DateField( widget=forms.DateInput(attrs={'class': 'form-control', "id": "date_entry", "type": "date"}) )
修正后的视图代码
def index(request): if request.method == "GET": form = RecordSearchForm(data=request.GET) # 必须先执行表单验证 if form.is_valid(): # 从cleaned_data中获取已验证的字段值 is_game = form.cleaned_data.get('is_game') is_work = form.cleaned_data.get('is_work') is_progress = form.cleaned_data.get('is_progress') entry_date = form.cleaned_data.get('entry_date') if is_game: object_list = GameDataEntry.objects.filter(entry_date=entry_date) return HttpResponse(object_list, content_type='text/plain') if is_work: object_list = WorkHoursEntry.objects.filter(entry_date=entry_date) return HttpResponse(object_list, content_type='text/plain') if is_progress: object_list = ProjectProgressEntry.objects.filter(entry_date=entry_date) return HttpResponse(object_list, content_type='text/plain') else: form = RecordSearchForm() return render(request, 'index.html', context={'form': form})
额外说明:
form.is_valid()会自动完成数据清洗、类型转换(比如将前端传入的日期字符串转为date对象),直接从cleaned_data取值比request.GET.get更安全可靠。- 移除了不必要的模型实例化代码,直接使用模型类调用查询方法。
内容的提问来源于stack exchange,提问作者ZaneColeRiley
相关产品推荐
相关产品推荐

