How to set value of model field as currently logged user? Django

Viewed 217

I have Event model which has a field creator as ForeignKey with attribute User. In views.py, I have create_event which creates event using EventForm. How to set default value of creator in EventForm as currently logged user? It is set default as admin, I do not want to set it manually every time I create an event, because it would be annoying if I have a lot of users created.

models.py:

class Event(models.Model):
    SPORT = (
        ('Football', 'Football'),
        ('Volleyball', 'Volleyball'),
        ('Basketball', 'Basketball'),
        ('Futsal', 'Futsal'),
        ('Tennis', 'Tennis'),
        ('Handball', 'Handball'),
        ('Ice Hockey', 'Ice Hockey'),
        ('Paintball', 'Paintball')
    )
    creator = models.ForeignKey(User, null=True, on_delete=models.SET_NULL)
    sport = models.CharField(max_length=20, null=True, choices=SPORT)
    event_name = models.CharField(max_length=30)
    event_date = models.DateTimeField(default=date.today())
    end_event_date = models.DateTimeField(default=date.today())
    current_members = models.IntegerField(default=1)
    total_members = models.IntegerField(default=0)
    event_location = models.CharField(max_length=50)
    cost = models.FloatField(default=0, max_length=5)
    description = models.CharField(max_length=300, blank=True)

    def __str__(self):
        return self.event_name

views.py:

@login_required(login_url='login')
def create_event(request):
    form = EventForm()
    if request.method == 'POST':
        form = EventForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('/')

    context = {'form': form}
    return render(request, 'events/create_event.html', context)

forms.py:

class EventForm(ModelForm):
    class Meta:
        model = Event
        fields = ['creator', 'sport', 'event_name', 'event_date', 'end_event_date', 'total_members', 'current_members', 'event_location', 'cost', 'description']
1 Answers

First, remove the creator field from the model form

class EventForm(ModelForm):
    class Meta:
        model = Event
        fields = [
            "creator", # remove this field
            "sport",
            "event_name",
            "event_date",
            "end_event_date",
            "total_members",
            "current_members",
            "event_location",
            "cost",
            "description",
        ]

Then use commit parameter of Form.save(...) as

@login_required(login_url='login')
def create_event(request):
    form = EventForm()
    if request.method == 'POST':
        form = EventForm(request.POST)
        if form.is_valid():
            event = form.save(commit=False)
            event.creator = request.user
            event.save()
            return redirect('/')

    context = {'form': form}
    return render(request, 'events/create_event.html', context)
Related