我正在做一个出勤系统,学生可以通过在下拉列表值中查找他们的名字来标记他们的出勤率。然后学生将按提交,信息将存储在 MarkAtt 数据库中。目前它没有根据类(class)显示学生姓名,当我点击提交时它显示以下错误:“valueerror”出现。 ValueError Exception Value: Cannot assign ", , ......"MarkAtt.studName"必须是一个 "Namelist"实例。我需要每次点击将学生的选定姓名存储在数据库中....
class MarkAtt(models.Model):
studName = models.ForeignKey(Namelist,on_delete=models.SET_NULL,blank=True, null=True, default=None)
classGrp = models.ForeignKey('GroupInfo', on_delete=models.SET_NULL, null=True)
currentDate = models.DateField(default=now())
week = models.IntegerField(default=0)
attendance = models.IntegerField(default=1) #1 is present
模板在下拉列表框中显示类(class)信息、今天的日期和学生姓名。
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
Lab Group: {{group.classGrp}} //this is from another view
Day: {{group.day}}
Time: {{group.time}}
Today's date: {{today.date}}
{{form.as_p}}
View :
def mark_stud(request,id):
group = GroupInfo.objects.get(id=id)
studName = Namelist.objects.filter(classGrp=id)
information = {}
information['group'] = group
information['studName'] =studName
if request.method == 'POST':
form = studentAttendanceForm(request.POST)
if form.is_valid():
att = form.save(commit=False)
att.studName = information['studName']
att.currentDate = datetime.datetime.now.date()
form.save()
return redirect('namelist.html')
else:
form = studentAttendanceForm()
return render(request, 'namelist.html', {'information' :information, 'form':form})
表格.py
类 studentAttendanceForm(forms.ModelForm): 类元: 型号 = MarkAtt 字段 = ['studName'] 标签 = { '姓名':'学生姓名'
def __init__(self,*args, **kwargs):
super(studentAttendanceForm, self).__init__(*args,**kwargs)
self.fields['studName'].label = "Select your name:"
但是,表单没有显示在模板页面中,我无法将值保存在数据库中。非常感谢您的帮助。非常感谢。
最佳答案
你必须分开GET
和 POST
在你看来请求,例如:
if request.method == POST:
form = studentAttendanceForm(request.POST)
if form.is_valid():
att = form.save(commit=False)
att.studName = information['studName']
att.currentDate = datetime.datetime.now.date()
form.save()
return redirect('namelist.html')
else: # for GET request
form = studentAttendanceForm()
return render(request, 'namelist.html', {'information' :information, 'form':form})
对于你的表格,最好使用fields
而不是 exclude
:
class studentAttendanceForm(forms.ModelForm):
class Meta:
model = MarkAtt
fields = ('studName')
def __init__(self, *args, **kwargs):
super(studentAttendanceForm, self).__init__(*args, **kwargs)
self.fields['studName'].label = "Select your name:"
然后在你的模板中,
如果你使用 form.as_p
,您不必调用 form.att.label_tag
, 而不必将其放在 <p>
中标签
请参阅文档:form.as_p
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
...
{{form.as_p}}
...
好的另一个问题是,什么是group
和 today
在你的模板中?
Lab Group: {{group.classGrp}}
Day: {{group.day}}
Time: {{group.time}}
Today's date: {{today.date}}
你没有包括 group
和 today
在你看来,所以它应该什么都不打印。
因为在你的渲染函数中,你只发送 information
和 form
,
没有 group
和 today
return render(request, 'namelist.html', {'information' :information, 'form':form})
为了增加代码的可读性,最好这样写:
context = {
'information': information,
'form': form,
'group': ......, # fill this
'today': ...... # fill this too
}
return render(request, 'namelist.html', context)
已编辑
要根据群组ID指定下拉列表,您可以传递群组对象并使用.queryset
在__init__
形式
group = GroupInfo.objects.get(id=id)
if request.method == 'POST':
form = studentAttendanceForm(request.POST, class_group=group)
...
else:
form = studentAttendanceForm(request.POST, class_group=group)
def __init__(self,*args, **kwargs):
class_group = kwargs.pop('class_group')
super(studentAttendanceForm, self).__init__(*args,**kwargs)
self.fields['studName'].label = "Select your name:"
self.fields['studName'].queryset = Namelist.objects.filter(classGrp=class_group)
关于python - 如何在django中将下拉列表值保存到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57839205/