Search code examples
pythondjangodjango-viewsdjango-signals

Checking for a condition in signals.py using a variable passed in a method existing in views.py - django


I'm trying to evaluate a situation here. I have a custom user Model (Using AbstractUser) that contains an extra field called 'role'. I can access the value of this field in views.py using a variable. Now I want to use that variable to check for a condition in signals.py before executing post_save. Here are my code snippets so far.

views.py

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

# Create your views here.
@user_passes_test(lambda u: u.is_superuser)
def register(request):
    if request.method == 'POST':
        register_form = UserRegisterForm(request.POST)
        if register_form.is_valid():
            register_form.save()
            username = register_form.cleaned_data.get('username')
            role = register_form.cleaned_data.get('role') //**This is the variable**
            messages.success(request, f'Welcome {username}, thank you for signing up.')
            return redirect('home')
    else:
        register_form = UserRegisterForm()

    context = {
        'register_form' : register_form,
        'title' : 'Register'
    }

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

signals.py

from django.db.models.signals import post_save
from django.conf import settings
from django.contrib.auth import get_user_model
from django.dispatch import receiver
from .models import Teacher

User = get_user_model()
@receiver(post_save, sender=User)
def create_teacher(sender, instance, created, **kwargs):
    if created:
        if hasattr(instance, 'role') and role == 'teacher': //Here is the condition
            Teacher.objects.create(user=instance)

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

Can someone please help me on how to go about it? Thanks


Solution

  • You make this much harder than it needs to be. Just create the teacher in the view.

    if register_form.is_valid():
        instance = register_form.save()
        username = register_form.cleaned_data.get('username')
        role = register_form.cleaned_data.get('role')
        if role == 'teacher':
            Teacher.objects.create(user=instance)
        messages.success(request, f'Welcome {username}, thank you for signing up.')
        return redirect('home')