我要实现的是用户将以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')
答案 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'