python - 如何在django中将下拉列表值保存到数据库

标签 python django database sqlite dropdown

我正在做一个出勤系统,学生可以通过在下拉列表值中查找他们的名字来标记他们的出勤率。然后学生将按提交,信息将存储在 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:" 

但是,表单没有显示在模板页面中,我无法将值保存在数据库中。非常感谢您的帮助。非常感谢。

最佳答案

你必须分开GETPOST在你看来请求,例如:

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}}
...

好的另一个问题是,什么是grouptoday在你的模板中?

Lab Group: {{group.classGrp}} 
Day: {{group.day}} 
Time: {{group.time}} 
Today's date: {{today.date}}

你没有包括 grouptoday在你看来,所以它应该什么都不打印。
因为在你的渲染函数中,你只发送 informationform ,
没有 grouptoday
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/

相关文章:

python - 在 Pandas Dataframe 列的嵌套字典中搜索和替换

python - 广义加性模型 - Python

php - 无法连接到数据库 : Access denied for user '' @'localhost' to database 'socialdb'

database - 非 ACID 数据库合规性对现实世界有哪些影响?

python - 使用 model.fit_generator 时 keras val 非常慢

python - Celerybeat执行任务

css - Django:针对不同 CSS 的一个模板还是两个模板?

python - django-mptt:处理并发插入

python - 如何将 XML 放入 HTML 模板中? python /Django

sql - 表列之间的一对多关系。分组和查找组合