How do I pre-populate Django ModelForm fields?

Question:

enter image description here

This form requires a student to login before filling it out. I want the input field with placeholder Enter Your Username to be pre-populated with the username of the individual filling it out.

Here is my models.py

class User_detail(models.Model):
    username = models.CharField(max_length=255, default="")
    first_name = models.CharField(max_length=255, default="")
    last_name = models.CharField(max_length=255, default="")
    email = models.EmailField(max_length=255, default="")
    date_of_birth = models.DateField(null=False, blank=False, default="")
    gender = models.CharField(max_length=50, choices=GENDER, default="")
    tel = PhoneNumberField()

    def __str__(self):
        return self.email

Here is my views.py

from django.contrib.auth.decorators import login_required
from .forms import *

def signin(request):
    if request.user.is_authenticated:
        return redirect(profile)
    if request.method == "POST":
        form = Signin(request.POST)
        if form.is_valid():
            username = request.POST["username"]
            password = request.POST["password"]

            user = auth.authenticate(username=username, password=password)

            if user is not None:
                auth.login(request, user)
                return redirect("profile")
            else:
                messages.error(request, "Invalid credentials")
                return redirect("signin")
    else:
        form = Signin()
        return render(request, "accounts/login.html", {"form": form})


@login_required(login_url="signin")
def user(request):
    if request.method == "POST":
        form = Userdetail(request.POST)
        if form.is_valid():
            user = form.save(commit=False)
            user.save()
            messages.success(request, "You Have Successfully updated your details")
            return render(request, "thanks.html")
    else:
        form = Userdetail()
    return render(request, "accounts/User details.html", {"form": form})


Here is my Forms.py

class Signin(forms.Form):
    username = forms.CharField(
        max_length=255,
        widget=forms.TextInput(attrs={"placeholder": "Enter Your Userame"}),
    )
    password = forms.CharField(
        max_length=255,
        widget=forms.PasswordInput(
            attrs={"placeholder": "Enter Your Password", "id": "password"}
        ),
    )


class Userdetail(forms.ModelForm):
    class Meta:
        model = User_detail
        fields = "__all__"
        widgets = {
            "first_name": forms.TextInput(
                attrs={"placeholder": "Enter Your First Name"}
            ),
            "last_name": forms.TextInput(attrs={"placeholder": "Enter Your Last Name"}),
            "other_name": forms.TextInput(attrs={"placeholder": "Enter Other Names"}),
            "email": forms.EmailInput(
                attrs={"placeholder": "Enter Your E-mail Address"}
            ),
            "date_of_birth": forms.DateInput(attrs={"type": "date"}),
            "gender": forms.RadioSelect(attrs={"type": "radio", "class": "gender"}),
            "tel": forms.TextInput(attrs={"placeholder": "Enter Your Phone Number"}),
            'username':forms.TextInput(attrs={'placeholder': 'Enter Your Username'}),
        }

    def clean(self):
        super(Userdetail, self).clean()
        tel = self.cleaned_data.get("tel")
        email = self.cleaned_data.get("email")

        for instance in User_detail.objects.all():
            if instance.email == email:
                self.errors[""] = self.error_class(["E-mail already in use"])
            elif instance.tel == tel:
                self.errors[""] = self.error_class(["Phone Number already Exists"])

So what I am basically trying to achieve is that I want the username input field to be pre-poulated by username of the student that login to fill the form.

Asked By: Olasubomi

||

Answers:

You can use the initial argument for the form to set up default field values (see docs). So something like this should work:

def user(request):
else:
    form = Userdetail(initial = {'username': request.user.username})
Answered By: SamSparx