Search code examples
djangouser-profile

cannot auto create profile when registered new user from link


Problem :

user's profile hasn't be created through "Sign Up" link(new user register) but able to created in only admin page.

view.py

from django.shortcuts import render, redirect
from django.contrib import messages
from .forms import UserRegisterForm, UserUpdateForm, ProfileUpdateForm
from django.contrib.auth.decorators import login_required

def register_view(request):
    if request.method == 'POST':
        form = UserRegisterForm(request.POST)
        if form.is_valid():
            form.save()
            username = form.cleaned_data.get('username')
            messages.success(request, f'Your account has been created!!!')
            return redirect('login')
    else:
        form = UserRegisterForm()
    return render(request, 'users/register_users.html', {'form': form})

@login_required
def profile(request):
    if request.method == 'POST':
        u_form = UserUpdateForm(request.POST, instance=request.user)
        p_form = ProfileUpdateForm(request.POST,
                                   request.FILES,
                                   instance=request.user.profile)
        if u_form.is_valid() and p_form.is_valid():
            u_form.save()
            p_form.save()
            messages.success(request, f'Your account has been updated!!!')
            return redirect('profile')
    else:
        u_form = UserUpdateForm(instance=request.user)
        p_form = ProfileUpdateForm(instance=request.user.profile)

    context = {
    'u_form': u_form,
    'p_form': p_form
    }

    return render(request, 'users/profile_users.html',context)

model.py

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


class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    image = models.ImageField(default='abc.jpg', upload_to='profile_pics')

    def __str__(self):
        return f'{self.user.username} Profile'

    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)

forms.py

from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
from .models import Profile


class UserRegisterForm(UserCreationForm):
    email    = forms.EmailField(max_length=30)

    class Meta:
        model = User
        fields = [
        'username',
        'email',
        'password1',
        'password2',
        ]

class UserUpdateForm(forms.ModelForm):
    email    = forms.EmailField(max_length=30)

    class Meta:
        model = User
        fields = [
        'username',
        'email']

class ProfileUpdateForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = ['image']

signals.py

from django.db.models.signals import post_save
from django.contrib.auth.models import User
from django.dispatch import receiver
from .models import Profile

@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)

@receiver(post_save, sender=User)
def save_profile(sender, instance, **kwargs):
    instance.profile.save()

profile_users.html

{% extends 'postorder/base.html' %}
{% load crispy_forms_tags %}
{% block content %}
<div class="content-section">
  <div class="media">
    <img class="rounded-circle account-img" src="{{ user.profile.image.url }}">
    <div class="media-body">
      <h2 class="account-heading">{{ user.username }}</h2>
      <p class="text-secondary">{{ user.email }}</p>
    </div>
  </div>
  <form method="POST" enctype="multipart/form-data">
        {% csrf_token %}
        <fieldset class="form-group">
            <legend class="border-bottom mb-4">Profile info!</legend>
            {{ u_form|crispy }}
            {{ p_form|crispy }}
        </fieldset>
        <div class="form-group">
            <button class="btn btn-outline-info" type="submit">Update!</button>
        </div>
 </form>
</div>
{% endblock content %}

register_users.html

{% extends 'postorder/base_postorder.html' %}
{% load crispy_forms_tags %}
{% block content %}
    <div class="content-section">
        <form method="POST">
            {% csrf_token %}
            <fieldset class="form-group">
                <legend class="border-bottom mb-4">SUBMIT NOW!</legend>
                {{ form|crispy }}
            </fieldset>
            <div class="form-group">
                <button class="btn btn-outline-info" type="submit">Sign Up!</button>
            </div>
        </form>
        <div class="border-top pt-3">
            <small class="text-muted">
                ALready Have an Account? <a class="ml-2" href="{% url 'login' %}">Sign In!</a>
            </small>
        </div>

    </div>
{% endblock content %}
  • app.py applied signal

What 's wrong with the code? Apologize in advance for long code as newbie don't know where is the problem since different approach accumulated.


Solution

  • Problem solved after adding this script in int.py file , never been thought its need to be edited . Still helpful if someone can tell the reason.

    # _int_.py
    default_app_config = 'users.apps.UsersConfig'