开发者社区 问答 正文

从django表单在mysql中存储多个复选框

我无法发送选定的复选框值到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

展开
收起
kun坤 2019-12-25 22:18:16 548 分享 版权
阿里云 AI 助理回答

根据您提供的代码片段,问题可能出在以下几个方面:

  1. 表单字段与模型字段不匹配:您的PersonForm中似乎没有定义如何处理多选复选框的字段。Django默认的ModelForm无法直接处理多对多关系或多个外键的选择。如果choosetopics需要存储多个值,它应该是一个ManyToManyField或者使用MultipleChoiceField和ModelMultipleChoiceField在表单中。

  2. 处理多选数据:您尝试用request.POST.getlist('choosetopics[]')获取复选框的值,但这种方式并不适用于Django ModelForm的常规处理方式。对于多选字段,您应该在表单类中正确定义,并且在视图中通过表单实例来处理这些值。

  3. 未提交表单数据:您打印了请求中的复选框值,但这并没有实际保存到数据库中。确保在验证表单有效后,通过表单对象调用适当的方法来保存数据。

针对这些问题,这里提供一个修改后的方案:

models.py

首先,确认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

forms.py

接下来,创建一个表单类,确保包含正确的字段类型来处理多选。

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']

views.py

最后,更新视图以使用新创建的表单类,并正确处理多选数据的保存。

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数据库。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答