如何在表单域中输入模型实例
How to input a model instance in a form field
我有一个带有 2 个的简单模型 类:
class Company(models.Model):
company_name = models.CharField(default='', max_length=128, blank=True, null=True)
class Visitor(models.Model):
visitor_company = models.ForeignKey(Company)
visitor_name = models.CharField(default='', max_length=128, blank=False, null=False)
我也有一个简单的表格:
class VisitorForm(forms.ModelForm):
visitor_company = forms.CharField()
class Meta:
model = Visitor
fields = "__all__"
这里是 view.py 代码:
def home(request):
form = Visitor()
if request.method == "POST":
form = Visitor(request.POST)
if form.is_valid():
obj, created = Visitor.objects.get_or_create(**form.cleaned_data)
if created:
messages.add_message(request, messages.SUCCESS, 'Visitor added.')
else:
messages.add_message(request, messages.INFO, 'Visitor exists : %s' % obj.visitor_name)
return redirect('visitors')
context = { 'form': form }
return render(request, "visitors/home.html", context)
我已将 visitor_company
设置为 CharField
,因为我想使用 Typeahead 让用户指定 ForeignKey
,而不是 Django 的内置下拉列表(这将如果我没有设置输入类型就会出现)。
但是,当我使用此方法时,即使我在 visitor_company
字段中输入了有效的 company_name
,我也会得到 Cannot assign "XXX": "Visitor.visitor_company" must be a "Company" instance
.
如何输入公司实例?如果 Company
记录不存在,是否也可以像这样在 ForeignKey
上使用 get_or_create
?
这是未经测试的代码,因此将其视为起点,没有真正的解决方案:
forms.py
class VisitorForm(forms.ModelForm):
visitor_company = forms.CharField()
def clean_visitor_company(self):
vc = self.cleanded_data['visitor_company']
try:
vc_object = Company.objects.get(company_name=vc)
except Company.DoesNotExist:
vc_object = Company.objects.create(company_name=vc)
return vc_object
class Meta:
model = Visitor
fields = "__all__"
views.py
def home(request):
form = VisitorForm(request.POST or None)
if form.is_valid():
form.save()
return redirect('visitors')
return render(request, "visitors/home.html", { 'form': form })
我有一个带有 2 个的简单模型 类:
class Company(models.Model):
company_name = models.CharField(default='', max_length=128, blank=True, null=True)
class Visitor(models.Model):
visitor_company = models.ForeignKey(Company)
visitor_name = models.CharField(default='', max_length=128, blank=False, null=False)
我也有一个简单的表格:
class VisitorForm(forms.ModelForm):
visitor_company = forms.CharField()
class Meta:
model = Visitor
fields = "__all__"
这里是 view.py 代码:
def home(request):
form = Visitor()
if request.method == "POST":
form = Visitor(request.POST)
if form.is_valid():
obj, created = Visitor.objects.get_or_create(**form.cleaned_data)
if created:
messages.add_message(request, messages.SUCCESS, 'Visitor added.')
else:
messages.add_message(request, messages.INFO, 'Visitor exists : %s' % obj.visitor_name)
return redirect('visitors')
context = { 'form': form }
return render(request, "visitors/home.html", context)
我已将 visitor_company
设置为 CharField
,因为我想使用 Typeahead 让用户指定 ForeignKey
,而不是 Django 的内置下拉列表(这将如果我没有设置输入类型就会出现)。
但是,当我使用此方法时,即使我在 visitor_company
字段中输入了有效的 company_name
,我也会得到 Cannot assign "XXX": "Visitor.visitor_company" must be a "Company" instance
.
如何输入公司实例?如果 Company
记录不存在,是否也可以像这样在 ForeignKey
上使用 get_or_create
?
这是未经测试的代码,因此将其视为起点,没有真正的解决方案:
forms.py
class VisitorForm(forms.ModelForm):
visitor_company = forms.CharField()
def clean_visitor_company(self):
vc = self.cleanded_data['visitor_company']
try:
vc_object = Company.objects.get(company_name=vc)
except Company.DoesNotExist:
vc_object = Company.objects.create(company_name=vc)
return vc_object
class Meta:
model = Visitor
fields = "__all__"
views.py
def home(request):
form = VisitorForm(request.POST or None)
if form.is_valid():
form.save()
return redirect('visitors')
return render(request, "visitors/home.html", { 'form': form })