Cohen
Cohen

Reputation: 984

Django Admin prepopulate user's email

I need some help to prepopulate user's email in my models. There has to be an easy way, but i think i am too tired to see the trick. Basically what i need, after the user has been logged in to admin, i need those fields like user, email and name from the User model to be already populated with the info of the current user.

Your help will be much appreciated! Currently my models are like this:

class ParcareManager(models.Manager):

    def active(self, *args, **kwargs):
        return super(ParcareManager, self).filter(draft=False).filter(parking_on__lte=timezone.now())

class Parcare(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True, default=1, on_delete=True)

    email=models.EmailField(blank=True, null=True)
    # email = models.EmailField(settings.AUTH_USER_MODEL)
    parking_on = models.DateField(auto_now=False, auto_now_add=False,blank=True, null=True)
    parking_off = models.DateField(
        auto_now=False, auto_now_add=False, blank=True, null=True) #plecarea din parcare
    location =models.CharField(max_length=120, default="P1", blank=True, null=True)
    updated = models.DateTimeField(auto_now=True, auto_now_add=False,blank=True, null=True)
    timestamp=models.DateTimeField(auto_now=False, auto_now_add=True,blank=True, null=True)
    venire = models.TimeField(default=datetime.time(9, 00),auto_now=False, auto_now_add=False )
    plecare = models.TimeField(default=datetime.time(
        18, 00), auto_now=False, auto_now_add=False)
    objects = ParcareManager()

    def __str__(self):
        return self.email + " | " + self.location + " | " + str(self.parking_on) + " | " + str(self.parking_off)

    class Meta:
        verbose_name_plural = "parcare"

class Meta:
    ordering = ["-timestamp", "-updated"]

My admin is like this:

from django.contrib import admin

# Register your models here.
from .models import Parcare


class ParcareModelAdmin(admin.ModelAdmin):
    list_display = [ "email","user", "location",
                    "parking_on", "parking_off",  "venire", "plecare"]
    list_display_links = ["email", "user" ]
    list_editable = [ "parking_off", "parking_on","venire", "plecare"]
    list_filter = ["parking_on", "parking_off", "venire",  "plecare"]
    search_fields = ["location", "name"]

    class Meta:
        model = Parcare

    def email(self, obj):
        return obj.user.email

admin.site.register(Parcare, ParcareModelAdmin)

enter image description here

Upvotes: 0

Views: 73

Answers (1)

not2acoder
not2acoder

Reputation: 1152

If this is the case, then you may try this:

def get_form(self, request, obj=None, **kwargs):
    form = super().get_form(request, obj, **kwargs)
    if not obj:
        user = request.user
        form.base_fields['user'].initial = user
        form.base_fields['email'].initial = user.email
    return form

Here you are fetching the logged in user object from request and then initializing the values from that user.

Upvotes: 1

Related Questions