我无法发送选定的复选框值到mysql数据库。请帮助我找出我在代码中遗漏了什么。当我尝试提交表单时,它只是重定向到相同的表单,没有任何错误,并且以相同的方式不在数据库中存储值。 views.py
def personview(request):
if request.method == "POST":
form =PersonForm(request.POST)
print(request.POST.getlist('choosetopics[]'))
if form.is_valid():
try:
form.save()
except:
print("not valid")
else:
form = PersonForm()
return render(request,'person_list.html',{'form':form})
models.py
class Person(models.Model):
name = models.ForeignKey(CollegeAttributes, on_delete=models.SET_NULL, null=True)
domain = models.ForeignKey(Domains, on_delete=models.SET_NULL, null=True)
choosetopics = models.ForeignKey(domain_topics, on_delete=models.SET_NULL, null=True)
def __str__(self):
return self.name
问题来源StackOverflow 地址:/questions/59385538/store-multiple-check-boxes-in-mysql-from-django-form
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
根据您提供的代码片段,问题可能出在以下几个方面:
表单字段与模型字段不匹配:您的PersonForm
中似乎没有定义如何处理多选复选框的字段。Django默认的ModelForm无法直接处理多对多关系或多个外键的选择。如果choosetopics
需要存储多个值,它应该是一个ManyToManyField或者使用MultipleChoiceField和ModelMultipleChoiceField在表单中。
处理多选数据:您尝试用request.POST.getlist('choosetopics[]')
获取复选框的值,但这种方式并不适用于Django ModelForm的常规处理方式。对于多选字段,您应该在表单类中正确定义,并且在视图中通过表单实例来处理这些值。
未提交表单数据:您打印了请求中的复选框值,但这并没有实际保存到数据库中。确保在验证表单有效后,通过表单对象调用适当的方法来保存数据。
针对这些问题,这里提供一个修改后的方案:
首先,确认choosetopics
是设计为可以有多个选项的。如果是这样,应该将其定义为ManyToManyField。
class Person(models.Model):
name = models.ForeignKey(CollegeAttributes, on_delete=models.SET_NULL, null=True)
domain = models.ForeignKey(Domains, on_delete=models.SET_NULL, null=True)
# 修改为ManyToManyField以支持多选
choosetopics = models.ManyToManyField(domain_topics, related_name='persons')
def __str__(self):
return self.name.name # 假设CollegeAttributes的__str__方法返回name
接下来,创建一个表单类,确保包含正确的字段类型来处理多选。
from django import forms
from .models import Person, domain_topics
class PersonForm(forms.ModelForm):
# 使用ModelMultipleChoiceField处理多选
choosetopics = forms.ModelMultipleChoiceField(
queryset=domain_topics.objects.all(),
widget=forms.CheckboxSelectMultiple
)
class Meta:
model = Person
fields = ['name', 'domain', 'choosetopics']
最后,更新视图以使用新创建的表单类,并正确处理多选数据的保存。
from .forms import PersonForm # 确保导入的是新创建的表单类
def personview(request):
if request.method == "POST":
form = PersonForm(request.POST)
if form.is_valid():
try:
# 无需额外操作,form.save()会自动处理多对多关系
form.save()
return redirect('success_url') # 重定向到成功页面
except Exception as e:
print("Error saving form:", e)
else:
form = PersonForm()
return render(request, 'person_list.html', {'form': form})
请确保替换 'success_url'
为实际的重定向URL。以上修改应该能解决您遇到的问题,允许您正确地从Django表单发送并存储多选框值到MySQL数据库。