【问题标题】:How to input a model instance in a form field如何在表单字段中输入模型实例
【发布时间】:2015-07-25 19:30:32
【问题描述】:

我有一个包含 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

【问题讨论】:

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


【解决方案1】:

这是未经测试的代码,因此请将此视为起点,没有真正的解决方案:

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 })

【讨论】:

    猜你喜欢
    • 2020-01-15
    • 2011-11-20
    • 2022-11-17
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 2023-01-19
    • 1970-01-01
    • 2020-02-04
    相关资源
    最近更新 更多