如何使用multiplechoicefield创建django表单并将这些值添加到数据库

时间:2019-10-11 11:23:24

标签: django django-models django-forms django-views

我要实现的是用户将以1)名称2)下拉菜单选择技术人员,3)multiselect下拉菜单选择多个产品的形式提交3个输入。用户提交详细信息后 它将在数据库中生成一个潜在客户,其值类似于不同表中的所选技术人员的姓名,外键和所选产品的ID。我不知道如何实现这一目标,下面我提到了实现我想要的目标的方法。请让我知道模型是否需要更改,以及如何为它们编写视图。

models.py

class product(models.Model):

    name = models.CharField(max_length=20)

class technician(models.Model):

    name = models.CharField(max_length=20)

class lead(models.Model):

    name = models.CharField(max_length=20)
    technician = models.ForeignKey(technician,on_delete=models.SET_NULL,null=True) #only single selection
    products = models.ManyToManyField(product) #user can select multiple product in dropdown

form.py

class leadForm(form.ModelForm):

    products = forms.MultipleChoiceField(queryset=Product.objects.all())
    technician = forms.CharField(max_length=30,choices=[(i.id,i.name) for i in Technician.objects.all().values('id','name') 
    class Meta:
        model = lead
        fields = ('name','technician')

1 个答案:

答案 0 :(得分:1)

您应该在此处使用ModelMultipleChoiceField [Django-doc]。但是,实际上您不需要自己实现模型。您只需让Django逻辑为您完成工作即可。

为了在HTML端给出文本表示,您可以覆盖模型的__str__函数:

class Product(models.Model):
    name = models.CharField(max_length=20)

    def __str__(self):
        return self.name

class Technician(models.Model):
    name = models.CharField(max_length=20)

    def __str__(self):
        return self.name

class Lead(models.Model):
    name = models.CharField(max_length=20)
    technician = models.ForeignKey(Technician, on_delete=models.SET_NULL, null=True)
    products = models.ManyToManyField(Product)

然后我们可以简单地使用以下方式定义表单:

class LeadForm(form.ModelForm):
    class Meta:
        model = Lead
        fields = '__all__'
  

注意:通常,类以PamelCase编写,因此以 U 小写字母开头。

例如,您可以在此处使用基于类的CreateView [Django-doc]

from django.views.generic.edit import CreateView
from app.models import Lead
from app.forms import LeafForm

class LeadCreateView(CreateView):
    model = Lead
    form_class = LeadForm
    template_name = 'create_lead.html'