views:

4581

answers:

3

For example I can point the url '^/accounts/password/reset/$' to django.contrib.auth.views.password_reset with my template filename in the context but I think need to send more context details.

I need to know exactly what context to add for each of the password reset & change views.

Thanks.

+1  A: 

The documentation says that there only one context variable, form.

If you're having trouble with login (which is common), the documentation says there are three context variables:

  • form: A Form object representing the login form. See the forms documentation for more on Form objects.
  • next: The URL to redirect to after successful login. This may contain a query string, too.
  • site_name: The name of the current Site, according to the SITE_ID setting.
S.Lott
The documentation says there is an "optional argument" called "template_name" which seems more relevant.
jb
The optional argument is an argument to the function, not context provided to the form.
S.Lott
Mmm- I think the question is confusing in that it talks about 'context' when really all that's relevant to solving this is the arguments of the `password_reset` view.
jb
+8  A: 

If you take a look at the sources for django.contrib.views.password_reset you'll see that it uses RequestContext. The upshot is, you can use Context Processors to modify the context which may allow you to inject the information that you need.

The b-list has a good introduction to context processors.

Edit (I seem to have been confused about what the actual question was):

You'll notice that password_reset takes a named parameter called "template_name":

def password_reset(request, is_admin_site=False, 
            template_name='registration/password_reset_form.html',
            email_template_name='registration/password_reset_email.html',
            password_reset_form=PasswordResetForm, 
            token_generator=default_token_generator,
            post_reset_redirect=None):

... thus, with a urls.py like:

from django.conf.urls.defaults import *
from django.contrib.auth.views import password_reset

urlpatterns = patterns('',
     (r'^/accounts/password/reset/$', password_reset, {'template_name': 'my_templates/password_reset.html'}),
     ...
)

django.contrib.auth.views.password_reset will be called for URLs matching '/accounts/password/reset' with the keyword argument 'template_name' = 'my_templates/password_reset.html'.

Otherwise, you don't need to provide any context as the password_reset view takes care of itself. If you want to see what context you have available, you can trigger a TemplateSyntax error and look through the stack trace find the frame with a local variable named 'context'. If you want to modify the context then what I said above about context processors is probably the way to go.

In summary: What do you need to do to use you're own template? Provide a 'template_name' keyword argument to the view when it is called. You can supply keyword arguments to views by including a dictionary as the third member of a URL pattern tuple.

Aaron Maenpaa
I believe the question is about using different templates with builtin views - Context processors doesn't factor into it!
jb
+1  A: 

You just need to wrap the existing functions and pass in the template you want. For example:

from django.contrib.auth.views import password_reset

def my_password_reset(request, template_name='path/to/my/template'):
    return password_reset(request, template_name)

To see this just have a look at the function declartion of the built in views:

http://code.djangoproject.com/browser/django/trunk/django/contrib/auth/views.py#L74

jb
Not the simplest way to do that. You can pass in a dictionary as a third part of a URL patterns tuple or, if you feel you really must wrap the function, you could use: password_reset = functools.partial(password, template_name = "path/to/my/template")
Aaron Maenpaa