Search code examples
djangodefault-value

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


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']

Solution

  • 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)