0

I have a simple model with 2 classes:

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)

I also have a simple form:

class VisitorForm(forms.ModelForm):
    visitor_company = forms.CharField()

    class Meta:
        model = Visitor
        fields = "__all__"

And here is the view.py code:

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)

I have set visitor_company as a CharField as I want to use Typeahead for users to specify the ForeignKey, rather than Django's built in dropdown (which would appear if I did not set the input type).

However, when I use this method, even if I input a valid company_name in the visitor_company field, I get Cannot assign "XXX": "Visitor.visitor_company" must be a "Company" instance.

How do I input a Company instance? Is it also possible to use get_or_create on a ForeignKey like this if the Company record doesn't exist?

alias51
  • 8,178
  • 22
  • 94
  • 166

1 Answers1

1

This is untested code, so consider this a starting point, no real solution:

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 })
Mischback
  • 843
  • 5
  • 18