Setting some fields to be automatically filled in using CreateVeiw in Django

I'm using Django's CreateView in order to fill a form and I want some of the fields to be automatically filled in, looking for ides how I could that. the fields that I want to be filled in automatically are company, recruiter and date

this is what the views file looks like:

class CreateNewJobForm(CreateView):
    model = Job
    fields = (
        'title', 'company', 'recruiter', 'job_type', 'work_from', 'description', 'city', 'address', 'title_keywords',
        'date_created')
    template_name = 'create_new_job_form.html'
    success_url = '/job_created_successfully'

    def form_valid(self, form):
        form.instance.recruiter = self.get_name()
        return super(CreateNewJobForm, self).form_valid(form)

and this is what the models file looks like:

class Recruiter(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, primary_key=True)
    name = models.CharField(max_length=255)
    company = models.ForeignKey(Company, on_delete=models.RESTRICT, related_name='recruiters')
    email = models.EmailField(max_length=255)
    phone_number = models.CharField(max_length=15, blank=True)

Automatically assign the value

We can assign a value without showing this in the form. In that case, you remove the company, recruiter, and date_created fields from the fields, and fill these in in the form_valid method:

from django.contrib.auth.mixins import LoginRequiredMixin

class CreateNewJobForm(LoginRequiredMixin, CreateView):
    model = Job
    fields = ('title', 'job_type', 'work_from', 'description', 'city', 'address', 'title_keywords')
    template_name = 'create_new_job_form.html'
    success_url = '/job_created_successfully'

    def form_valid(self, form):
        recruiter = form.instance.recruiter = self.request.user.recruiter
        form.instance.company_id = recruiter.company_id
        return super().form_valid(form)

for the date_created, you can work with the auto_now_add=True parameter [Django-doc] of the DateTimeField:

class Job(models.Model):
    # …
    date_created = models.DateTimeField(auto_now_add=True)

Provide an initial value

We can also provide an initial value for the form by overriding the .get_initial() method [Django-doc]:

from django.contrib.auth.mixins import LoginRequiredMixin
from django.utils.timezone import now

class CreateNewJobForm(LoginRequiredMixin, CreateView):
    model = Job
    fields = ('title', 'job_type', 'work_from', 'description', 'city', 'address', 'title_keywords', 'company', 'recruiter', 'date_created')
    template_name = 'create_new_job_form.html'
    success_url = '/job_created_successfully'

    def get_initial(self):
        recruiter = self.request.user.recruiter
        return {
            'recruiter': recruiter,
            'company': recruiter.company,
            'date_created': now()
        }

Something like that should work just fine :

 def form_valid(self, form):
    form.instance.user = self.request.user # assuming you want the current login user to be set to the user
    return super(CreateNewJobForm, self).form_valid(form)

It is just an example but in short you can access attributes of your model by accessing the instance of your form like that form.instance.yourfield

Back to Top