Django | set the default value of a model field to be the email of the logged in user

Viewed 75

I'm trying to display user specific content in my django website and I am one step away from completing this task. In models.py I need the contact_email field to have its default value to be the email of the logged in user. I've tried many methods of doing this but nothing has worked yet.

models.py

class Account(AbstractUser):
    email = models.EmailField(verbose_name='email', max_length=60, unique=True)
    name = models.CharField(max_length=45, unique=False)
    username = models.CharField(max_length=100, default='')
    date_joined = models.DateTimeField(verbose_name='date joined', auto_now_add=True)
    last_login = models.DateTimeField(verbose_name='last login', auto_now=True)
    is_admin = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)
    is_employee = models.BooleanField(default=True, verbose_name='Are you using FilmLink as an employee?')

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['name', 'is_employee']

    objects = MyAccountManager()

    class Meta:
        permissions = [
            ("post_jobs", "Can post jobs"),
        ]

    def __str__(self):
        return self.name

    def has_perm(self, perm, obj=None):
        return True

    def has_perms(self, perm):
        return True

    def has_module_perms(self, app_label):
        return True

    @property
    def is_staff(self):
        return self.is_admin

class Job(models.Model):
    company = models.CharField(max_length=40, null=True, verbose_name="Company/Employer")
    description = models.TextField(null=True)
    role = models.CharField(max_length=25)
    area_of_filming = models.CharField(max_length=50, verbose_name="Area Of Filming", default="")
    contact_email = models.EmailField(verbose_name='Contact Email', max_length=60, default='')#stuck on setting this default
    created = models.DateTimeField(auto_now_add=True)
    user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, on_delete=models.CASCADE)

    def __str__(self):
        return self.company

views.py

@login_required(login_url='login')
def manage_jobs(request):
    if request.user.is_employee:
        return redirect('home')
    else:
        form = JobForm(request.POST)
        if form.is_valid():
            form.save()
        jobs = Job.objects.filter(contact_email = request.user.email)
        context = {"form":form, "jobs":jobs}
        return render(request, 'employer/manage-jobs.html', context)

forms.py

class JobForm(ModelForm):
    class Meta:
        model = Job
        fields = ('company', 'description', 'role', 'area_of_filming', 'contact_email')

1 Answers

I don't believe you can set a default that way.

What you should do instead is, when creating a Job object and saving it to database, provide the value of contact_email yourself.

You would then be able to later filter the Job entries based on contact_email field.

# Creating a Job object
job = Job()
job.column1 = value
job.contact_email = request.user.email

# In other view, where you need to filter
jobs = Job.objects.filter(contact_email=request.user.email)

A random thought:

if the only reason you want that contact_email field there is to be able to apply the filter to get all Job objects for that particular user, then you can just filter with user field too.

jobs = Job.objects.filter(user=request.user)
context = {"form":form, "jobs":jobs, 'contact_email': request.user.email}
return render(request, 'employer/manage-jobs.html', context)
Related