Opened 2 years ago

Closed 2 years ago

Last modified 2 years ago

#33357 closed Bug (invalid)

SuccessMessageMixin doesn't work with LoginView

Reported by: Cihat Ertem Owned by: Baptiste Mispelon
Component: contrib.messages Version: 4.0
Severity: Normal Keywords: LoginView, messages, SuccessMessageMixin
Cc: Baptiste Mispelon Triage Stage: Accepted
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by Baptiste Mispelon)

I have a problem with SuccessMessageMixin, LoginView. There is no problem with CreateView:

class CreateRoom(SuccessMessageMixin, CreateView):

    template_name = 'base/room_form.html'
    form_class = RoomForm
    success_url = reverse_lazy('home')
    success_message = 'Message'

I can capture and use 'Message' in template but with LoginView

class Login(SuccessMessageMixin, LoginView):

    template_name = 'registration/login.html'
    success_url = reverse_lazy('home')
    success_message = 'Message!!!'

I can not capture 'Message' with LoginView.

project urls:

urlpatterns = [

    path('admin/', admin.site.urls),
    path(, include('django.contrib.auth.urls')),
    path(, include('base.urls')),

]

the base apps urls:

# app_name = 'base'

urlpatterns = [

    path(, views.Home.as_view(), name='home'),
    path('room/<int:pk>/', views.Room.as_view(), name='room'),
    path('create-room/', views.CreateRoom.as_view(), name='create-room'),
    path('update-room/<int:pk>/', views.UpdateRoom.as_view(model=Room), name='update-room'),
    path('delete-room/<int:pk>/', views.DeleteRoom.as_view(model=Room), name='delete-room'),
    path('login/', views.Login.as_view(), name='login')

]

settings.py:

INSTALLED_APPS = [

        # Default django apps
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',

        # My custom apps
        'base.apps.BaseConfig',

]

MIDDLEWARE = [

    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',

]

ROOT_URLCONF = 'studybud.urls'

TEMPLATES = [

    {

        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'templates']
        ,
        'APP_DIRS': True,
        'OPTIONS': {

            'context_processors': [

                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',

            ],

        },

    },

]

WSGI_APPLICATION = 'studybud.wsgi.application'

# Database
# ​https://docs.djangoproject.com/en/4.0/ref/settings/#databases

DATABASES = {

    'default': {

        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',

    }

}

# Password validation
# ​https://docs.djangoproject.com/en/4.0/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [

    {

        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',

    },
    {

        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',

    },
    {

        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',

    },
    {

        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',

    },

]

# Internationalization
# ​https://docs.djangoproject.com/en/4.0/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_TZ = True

# Static files (CSS, JavaScript, Images)
# ​https://docs.djangoproject.com/en/4.0/howto/static-files/

STATIC_URL = 'static/'

# Default primary key field type
# ​https://docs.djangoproject.com/en/4.0/ref/settings/#default-auto-field

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

# Login redirect
LOGIN_REDIRECT_URL = 'home'
LOGIN_URL = 'login'

Change History (4)

comment:1 by Baptiste Mispelon, 2 years ago

Cc: Baptiste Mispelon added
Component: contrib.messagescontrib.auth
Description: modified (diff)
Owner: changed from nobody to Baptiste Mispelon
Status: newassigned
Summary: LoginView combine SuccessMessageMixin failed!SuccessMessageMixin doesn't work with LoginView
Triage Stage: UnreviewedAccepted

Hi,

Thanks for reporting this issue. I've taken the liberty to edit your original report to remove information that I don't think is relevant, I hope that's ok.

The issue comes from the fact that LoginView.form_valid() doesn't call super():

    def form_valid(self, form):
        """Security check complete. Log the user in."""
        auth_login(self.request, form.get_user())
        return HttpResponseRedirect(self.get_success_url())

I can't find a documented reason why and changing it to this doesn't break any tests:

    def form_valid(self, form):
        """Security check complete. Log the user in."""
        auth_login(self.request, form.get_user())
        return super().form_valid(form)

That change should fix the reported issue and seems straightforward enough.

comment:2 by Baptiste Mispelon, 2 years ago

Component: contrib.authcontrib.messages
Description: modified (diff)
Resolution: needsinfo
Status: assignedclosed

It turns out my initial tests were incorrect and I cannot actually reproduce your issue.

Using class MyView(SuccessMessageMixin, LoginView) works fine for me, there must be something else that's broken in your setup.

I've marked the ticket as "needs info" and restored your original description. Could you reopen the ticket with some details on how to reproduce your issue?
In particular, how do you display the messages in your templates.

Thanks.

comment:3 by Cihat Ertem, 2 years ago

Resolution: needsinfofixed

Ok, I found my fault!

I changed urlpattern order from this:
...

urlpatterns = [

path('admin/', admin.site.urls),
path(, include('django.contrib.auth.urls')),
path(
, include('base.urls')),

]
to this:
urlpatterns = [

path('admin/', admin.site.urls),
path(, include('base.urls')),
path(
, include('django.contrib.auth.urls')),

]

Thanks for your replies. Maybe a note should be add for order priority to doc. section.

comment:4 by Mariusz Felisiak, 2 years ago

Resolution: fixedinvalid
Note: See TracTickets for help on using tickets.
Back to Top