Davtho1983
Davtho1983

Reputation: 3954

Django pass time value and user value to forms.py

I have a model like this:

from django.db import models
from django.contrib.auth.models import User

class Task(models.Model):

    title = models.CharField(max_length=200)
    pub_date = models.DateTimeField(default)
    completed = models.BooleanField(default=False)
    description = models.TextField()
    user = models.ForeignKey(User, on_delete=models.CASCADE)

    def summary(self):
        return self.description[:50]

    def pub_date_pretty(self):
        return self.pub_date.strftime('%b %e %Y')

    def __str__(self):
        return self.title

I have a forms.py like this because I don't want the user to be able to determine which user is saving the data and I want the pub_date to be the time now:

from django import forms
from .models import Task

from django.utils import timezone

class Taskform(forms.ModelForm):
    class Meta:
        model = Task
        fields = ['title', 'description', 'completed']

My view is like this:

@login_required
def create(request):
    form = Taskform(request.POST or None)
    task = Task()
    task.pub_date = timezone.datetime.now()
    task.user = request.user

    if form.is_valid():
        form.save()
        return redirect('')

    return render(request, 'home/create.html', {'form': form})

I want to pass the time and the user to the form as it validates but I'm not sure how?

Upvotes: 0

Views: 32

Answers (1)

neverwalkaloner
neverwalkaloner

Reputation: 47364

You can use form.save() with commit=True argument to take task instance and update it:

if form.is_valid():
    task = form.save(commit=False)
    task.pub_date = timezone.datetime.now()
    task.user = request.user
    task.save()
    return redirect('')

Check detail here.

Upvotes: 1

Related Questions