Engineering Projects
Engineering Projects

Reputation: 80

Not getting model form values in template

Django user profile model form data is not getting displayed on the template, not even giving me an error!

I am learning to create Django registration form with user profile models I have created the registration form and profile form successfully but I am not getting any values from models.py file.

Models.py

class ExtenduserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    birth_date = models.DateField(null=True, blank=True)
    age = models.IntegerField()

   def __str__(self):
      return self.user.username

@receiver(post_save,sender=User)
def create_profile(sender, **kwargs):
    if kwargs['created']:
         user_profile = 
          ExtenduserProfile.objects.create(user=kwargs['instance'])

post_save.connect(create_profile, sender=User)

forms.py

class userprofile(forms.ModelForm):
   birth_date = forms.DateField(help_text='Required. Format: YYYY-MM-DD')
    class Meta:
        model = ExtenduserProfile
        fields = ('age','birth_date')

views.py

@login_required()
def UserProfile(request,pk=None):
     profile = ExtenduserProfile.objects.all()
     return render(request,'dashboard/profile.html',{'profile':profile})


 @login_required()
 def HomeScreen(request):
     if request.user.is_authenticated:
           username = request.user.username
     else :
           username = 'not logged in'
     context = {'username':username,'user':user}
     return render(request,'dashboard/Home.html',context)


  def singup(request):
      if request.method == 'POST':
           form = SignupForm(request.POST)
           user_profile = userprofile(request.POST)

           if form.is_valid() and user_profile.is_valid():
              user = form.save()
              profile = user_profile.save(commit=False)
              profile.user = user
              profile.save()

              username = form.cleaned_data.get('username')
              password = form.cleaned_data.get('password')
              user = authenticate(username = username, password = password)
             login(request,user)
             return redirect(login_view)

        else:
             form = SignupForm()
             user_profile = userprofile()

         context = {'form':form, 'user_profile':user_profile }
         return render(request,'account/signup.html',context)

HTML file

  {% extends 'dashboard/base.html' %}

 <html lang="en" dir="ltr">
  <head>
   <meta charset="utf-8">
    <title>Profile</title>
    </head>
     {% block content%}
     <body>
     <h3>Welcome to profile page</h3><br>

      {% if user.is_authenticated %}
      <h4>Name = {{user.first_name}} {{user.last_name}}</h4>
      <h4>Email = {{user.email}}</h4>
      <h4>Age = {{user.ExtenduserProfile.age}} </h4>
      <h4>DOB = {{user.ExtenduserProfile.birth_date}} </h4>
      {% endif %}
      </body>
      {% endblock%}
     </html>

my expected output should be name: xyz email: [email protected] age: 24 DOB: 1994-04-21

Upvotes: 0

Views: 153

Answers (2)

ruddra
ruddra

Reputation: 51948

Well, when you are using reverse relation in OneToOne, the class name should be in all lowercase(documentation). For example:

<h4>Age = {{user.extenduserprofile.age}} </h4>
<h4>DOB = {{user.extenduserprofile.birth_date}} </h4>

Also, why are you sending profile = ExtenduserProfile.objects.all() to template via context from your profile view? Because as I can see, you are not using it. So I think you can remove that part of code as well.

Also, you can remove the {% if user.is_authenticated %} and {%endif%} from template. As, this template can't be accessible unless you are logged in. You have restricted that via login_required decorator.

Upvotes: 0

Aseel Ashraf
Aseel Ashraf

Reputation: 681

What is a Custom User Model Extending AbstractUser?

It is a new User model that inherit from AbstractUser. It requires a special care and to update some references through the settings.py. Ideally it should be done in the begining of the project, since it will dramatically impact the database schema. Extra care while implementing it.

When should I use a Custom User Model Extending AbstractUser?

You should use it when you are perfectly happy with how Django handles the authentication process and you wouldn’t change anything on it. Yet, you want to add some extra information directly in the User model, without having to create an extra class.

I suggest to you to use Abstract User

Which is easier and best practice for your case

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

class User(AbstractUser):
   bio = models.TextField(max_length=500, blank=True)
   location = models.CharField(max_length=30, blank=True)
   birth_date = models.DateField(null=True, blank=True)

Also add this to your setting :

AUTH_USER_MODEL = 'appname.User'

Check this tutorial for more information

Upvotes: 1

Related Questions