pythondjangotemplatesdjango-urlsdjango-managers

AttributeError: 'RegisterPatientView' object has no attribute 'object'


When ever I am running the project and try to create register the patient or doctor it is showing this error. error and below it is showing error in return HttpResponseRedirect(self.get_success_url())

and if I try to visit login page it is not rendering.

Below is my code. views.py

class RegisterPatientView(CreateView):
    """
        Provides the ability to register as a Patient.
    """
    model = User
    form_class = PatientRegistrationForm
    template_name = 'accounts/patient/register.html'
    success_url = '/'

    extra_context = {
        'title': 'Register'
    }

    def dispatch(self, request, *args, **kwargs):
        if self.request.user.is_authenticated:
            return HttpResponseRedirect(self.get_success_url())
        return super().dispatch(self.request, *args, **kwargs)

    def post(self, request, *args, **kwargs):

        form = self.form_class(data=request.POST)

        if form.is_valid():
            user = form.save(commit=False)
            password = form.cleaned_data.get("password1")
            user.set_password(password)
            user.save()
            return redirect('accounts:login')
        else:
            return render(request, 'accounts/patient/register.html', {'form': form})

urls.py

from django.urls import path
from .views import *
from appointment.views import *

app_name = "accounts"

urlpatterns = [
    path('patient/register', RegisterPatientView.as_view(), name='patient-register'),
    path('patient/profile/update/', EditPatientProfileView.as_view(), name='patient-profile-update'),
    path('doctor/register', RegisterDoctorView.as_view(), name='doctor-register'),
    path('doctor/profile/update/', EditDoctorProfileView.as_view(), name='doctor-profile-update'),
    path('login', LoginView.as_view(), name='login'),
    path('logout', LogoutView.as_view(), name='logout'),
]

models.py

from accounts.managers import UserManager

GENDER_CHOICES = (
    ('male', 'Male'),
    ('female', 'Female'))


class User(AbstractUser):
    username = None
    role = models.CharField(max_length=12, error_messages={
        'required': "Role must be provided"
    })
    gender = models.CharField(max_length=10, blank=True, null=True, default="")
    email = models.EmailField(unique=True, blank=False,
                              error_messages={
                                  'unique': "A user with that email already exists.",
                              })
    phone_number = models.CharField(unique=True, blank=True, null=True, max_length=20,
                                    error_messages={
                                        'unique': "A user with that phone number already exists."
                                    })

    USERNAME_FIELD = "email"
    REQUIRED_FIELDS = []

    def __unicode__(self):
        return self.email

    objects = UserManager()

please! help me out and let me know if any other codes required. Thank you.


Solution

  • The error is because you're calling self.get_success_url() in dispatch(), the CreateView.get_success_url() depends the object field, that is created on CreateView.get() and CreateView.post() methods.

    I recommend you to change your view to:

    class RegisterPatientView(CreateView):
        . . .
        success_url = '/'
        . . .
    
        def dispatch(self, request, *args, **kwargs):
            if self.request.user.is_authenticated:
                return HttpResponseRedirect(self.success_url)
            return super().dispatch(self.request, *args, **kwargs)
    
        def post(self, request, *args, **kwargs):
            super().post(request, *args, **kwargs)
            form = self.form_class(data=request.POST)
            . . .