how to check and pass the instance of the user in my form in Django?

Hi I'm trying to create a form that accepts Log from the user however I don't know how to pass the instance of the user. I'm used to creating a CreateView for this, however since I'm planning to use customized widgets and settings, I'm using a modelform to create logs for the user.

My question is is this the same way as create view to check the instance of the user?

Is it still the same as what I did to my createview which is:

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

Or do I have to do something else entirely?

Here is my Forms.py:

from django import forms
from profiles.models import User
from .models import DPRLog


class DateInput (forms.DateInput):
    input_type = 'date'

class Datefield (forms.Form):
    date_field=forms.DateField(widget=DateInput)

class dprform(forms.ModelForm):

    class Meta:
        model = DPRLog
        widgets = {'reportDate':DateInput()}
        fields = ['status','login','logout','reportDate','mainTasks','remarks']

Models.py:

from django.db import models
from profiles.models import User
from django.urls import reverse



# Create your models here.

class Points(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    points = models.IntegerField(default=0, null=False)

    def __str__(self):
        return self.user.username


class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    image = models.ImageField(default='default.png', upload_to='profile_pics')

    def __str__(self):
        return f'{self.user.username} Profile'


class Manager(models.Model):
    manager = models.OneToOneField(User, on_delete=models.CASCADE)

    def __str__(self):
        return self.manager.full_name


class Member(models.Model):
    manager = models.ForeignKey(Manager, on_delete=models.CASCADE)
    member = models.OneToOneField(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=30, null=True)

    def __str__(self):
        return self.member.full_name


class Job(models.Model):
    manager = models.ForeignKey(Manager, on_delete=models.CASCADE)
    member = models.ForeignKey(Member, on_delete=models.CASCADE)
    title = models.CharField(max_length=30, blank=False, null=False)
    description = models.TextField()
    datePosted = models.DateTimeField(auto_now=True)
    file = models.FileField(null=True, blank=True, upload_to='job_files')

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('job-detail', kwargs={'pk': self.pk})

class DPRLog(models.Model):
    STATUS_CHOICES = (

        ('PENDING', 'PENDING'),
        ('CANCELLED', 'CANCELLED'),
        ('COMPLETED', 'COMPLETED'),


        )
    TASKS_CHOICES = (
        ('TESTS EXECUTION', 'TESTS EXECUTION'),
        ('TESTS DESIGN', 'TESTS DESIGN'),
        ('MOBILE TESTING WORKSHOP', 'MOBILE TESTING WORKSHOP'),
        ('BENCH ACTIVITY', 'BENCH ACTIVITY'),
        ('DEFECT ANALYSIS','DEFECT ANALYSIS'),
    )




    testuser = models.ForeignKey(User,on_delete = models.CASCADE)
    status = models.CharField(max_length=30, choices=STATUS_CHOICES,null=True)
    reportDate = models.DateField(blank=False, null=False)
    login = models.TimeField(blank=False, null=False)
    logout = models.TimeField(blank=False, null=False)
    mainTasks = models.CharField(max_length=50, blank=False, choices=TASKS_CHOICES, null=True)
    remarks = models.CharField(max_length=30,null=True)

    def __str__(self):
        return f'{self.testuser.full_name} DPR Log'

Views.py:

def dprmodelform(request):
    if request.method=='POST':
        form = dprform(request.POST)
        if form.is_valid():
            form.save()

    form = dprform()
    return render (request,'users/dprform.html',{'form':form})

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


class dprview(LoginRequiredMixin,ListView):
    model = DPRLog
    template_name = 'users/dpr_view.html'
    context_object_name = 'log'

Upvotes: 0

Views: 96

Answers (1)

Iain Shelvington
Iain Shelvington

Reputation: 32274

If you pass commit=False to form.save() you can get the instance from the validated form without saving to the database. You can then set the user attribute on the instance before calling save again

if form.is_valid():
    instance = form.save(commit=False)
    instance.testuser = request.user
    instance.save()

Upvotes: 2

Related Questions