如何将MultipleChoiceField保存到数据库

时间:2019-07-28 12:01:15

标签: django database

我想创建一个设置页面,用户可以在其中选择他们拥有的技能的多个值。它将具有一个主要类别,然后是子类别。我需要将它们保存到数据库中,以便查询它们并再次显示他们选择的技能。

我知道如何创建MultipleChoiceField,但不知道如何将它们保存到数据库。我该怎么办?

Forms.py

from django import forms


class skills(forms.Form):
    jobs = [
    ('Håndværker', (
            ('Gulv', 'Gulv'),
            ('Væg', 'Væg'),
        )
    ),
    ('Murer', (
            ('Mur', 'Mur'),
            ('blabla', 'blabla'),
        )
    ),
]
    job = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple,
                                         choices=jobs)

Views.py

from .forms import skills

def index(request):
    if request.method == 'POST':
        form = skills(request.POST)
        if form.is_valid():
            picked = form.cleaned_data.get('job')
            # do something with your results
    else:
        form = skills
    return render(request, 'settings/index.html', {"form":form})

页面加载时当前看起来像这样,很好。下一步就是将其保存到数据库中的方式,因此我可以再次显示它们的先前选择的值。 Example

3 个答案:

答案 0 :(得分:0)

由于您尚未设置任何模型,因此可以查看django-multiselectfield,它将存储所选的选项“作为逗号分隔值的CharField”。然后,您只需要从表单中传递这些值即可。

或者,您可以查看PostgreSQL's Array field

答案 1 :(得分:0)

我建议您使用Jobs模型和Skills模型。然后在工作模型上有一个技能字段,该字段将是技能模型的ManyToManyField。然后,Django可以ModelForm的形式自动为您生成表单。

# Create your models here.
class Skill(models.Model):
    name = models.CharField(max_length=20, null=False, blank=False)

    def __str__(self):
        return self.name


class Job(models.Model):
    name = models.CharField(max_length=20, null=False, blank=False)
    skills = models.ManyToManyField(Skill)

    def __str__(self):
        return self.name


class Person(models.Model):
    name = models.CharField(max_length=20, null=False, blank=False)
    skills = models.ManyToManyField(Skill)

    def __str__(self):
        return self.name

然后您可以将它们作为

添加到数据库中。
skill1 = Skill.objects.create(name="Skill One")
skill2 = Skill.objects.create(name="Skill Two")
skill3 = Skill.objects.create(name="Skill Three")
skill4 = Skill.objects.create(name="Skill Four")
job1 = Job.objects.create(name="Job One")
job1.skills.add(skill1)
job1.skills.add(skill2)
job2 = Job.objects.create(name="Job Two")
job2.skills.add(skill3)
job2.skills.add(skill4)

具有要显示的表单

class PersonForm(forms.ModelForm):
    class Meta:
        model = Person
        fields = ["name", "skills"]

您可以将表单或模板自定义为链接

答案 2 :(得分:0)

在models.py中只需使用CharField创建字段

from django.db import models
class UserProfileInfo(models.Model):
    Gender = models.CharField(max_length=10,default='')

在forms.py中只需创建如下所示的选择

class UserProfileInfoForm(forms.ModelForm):
    YESNO_CHOICES = (('male', 'male'), ('female', 'female'))
    Gender = forms.ChoiceField(choices=YESNO_CHOICES)
    class Meta():
         model = UserProfileInfo
         fields = ('Gender',)

在views.py中导入并显示此表单。

或者您绝对可以选择

https://pypi.org/project/django-multiselectfield/