Vistas y render() en Django

publicado por: Anonymous

Estoy aprendiendo a utilizar Django (específicamente la versión 1.9). Sin embargo, al momento de crear una vista, y al iniciar el servidor de Django, tengo el siguiente error:

TypeError: render() takes at least 2 arguments (1 given)

Lo que no entiendo es, ¿qué otros parámetros debe tener el método render(), aparte de la dirección de la vista (considerando que es estática)?
Este error fue corregido con la adición de parámetros faltantes. Sin embargo, ahora se me presenta el siguiente error, el cual no sé por qué se presenta:

AttributeError: 'str' object has no attribute 'regex'

En mi archivo views.py de mi aplicación, tengo lo siguiente (CORREGIDO):

from django.shortcuts import render
from django.template import Template

def index(request):
    template_name = '/app/web/index.html'
    return render(request, template_name)

En cuanto a mi archivo de URLs, éste tiene lo siguiente:

from django.conf.urls import include, url
from django.contrib import admin
import app.views

urlpatterns = ['',
    # Vista para pagina de inicio
    url(r'^$', app.views.index),
    # Otras vistas
    url(r'^admin/', include(admin.site.urls)),
    ]`

Y en el archivo de configuración, edité en parte la sección de templates, agregando la carpeta en donde está mi página en cuestión:

# Application definition
INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app'
    )

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

ROOT_URLCONF = 'vehiculos.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            '/app/web',
        ],
        '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 = 'vehiculos.wsgi.application'

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

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'vehiculos',
        'USER': 'root',
        'PASSWORD': '',
        # 'HOST': 'localhost'
        # 'PORT': '3306',
    }
}

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

LANGUAGE_CODE = 'es-CL'
TIME_ZONE = 'America/Argentina/Mendoza'
USE_I18N = True
USE_L10N = True
USE_TZ = True

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

STATIC_URL = '/static/'

Muchas gracias de antemano

solución

La función render debe recibir como primer parámetro el request de la vista que va a ser renderizada:

def index(request):
    template_name = '/app/web/index.html'
    return render(request, template_name)

El request y el nombre de tu template (template_name) son los parámetros mínimos que debe recibir la funcion render. Sería bueno que expliques la razón por la cual definiste tu función de esa manera, tomando como parámetro de la vista el template. Esto está mal:

def index(template='/app/web/index.html'):
    return render(template)`

Las vistas son funciones que obtienen un request y retornan una respuesta o response.

Con respecto a la URL:

url(r'^$', app.views.index())

No debes llamar a la función, solo debes pasar la referencia (sin usar paréntesis):

url(r'^$', app.views.index)

También puedes usar una cadena con la ruta a la función y con esto evitas estar importando app:

url(r'^$', 'app.views.index')

Actualización

Al parecer el problema es la definición de tus URLs ya que en la versión que estás usando urlpatterns es ahora una lista y el primer elemento '' es inválido. Cámbialo a:

urlpatterns = [
    # Vista para pagina de inicio
    url(r'^$', app.views.index),
    # Otras vistas
    url(r'^admin/', include(admin.site.urls)),
]
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *