#33357: SuccessMessageMixin doesn't work with LoginView
-------------------------------------+-------------------------------------
     Reporter:  fincan               |                    Owner:  Baptiste
                                     |  Mispelon
         Type:  Bug                  |                   Status:  assigned
    Component:  contrib.auth         |                  Version:  4.0
     Severity:  Normal               |               Resolution:
     Keywords:  LoginView,           |             Triage Stage:  Accepted
  messages, SuccessMessageMixin      |
    Has patch:  0                    |      Needs documentation:  0
  Needs tests:  0                    |  Patch needs improvement:  0
Easy pickings:  0                    |                    UI/UX:  0
-------------------------------------+-------------------------------------
Changes (by Baptiste Mispelon):

 * status:  new => assigned
 * cc: Baptiste Mispelon (added)
 * component:  contrib.messages => contrib.auth
 * owner:  nobody => Baptiste Mispelon
 * stage:  Unreviewed => Accepted


Old description:

> 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'

New description:

 I have a problem with `SuccessMessageMixin, LoginView`. There is no
 problem with `CreateView`:
 {{{#!py
 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`
 {{{#!py
 class Login(SuccessMessageMixin, LoginView):
     template_name = 'registration/login.html'
     success_url = reverse_lazy('home')
     success_message = 'Message!!!'
 }}}

 I can not capture 'Message' with `LoginView`.

--

Comment:

 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()`:
 {{{#!py
     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:
 {{{#!py
     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.

-- 
Ticket URL: <https://code.djangoproject.com/ticket/33357#comment:1>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/064.f2426dbc3abbcba943b3e897096738b5%40djangoproject.com.

Reply via email to