En mis aplicaciones de Django, tengo muchas URL incluyendo /(?P<project_name>[_\w]+)/. Los usuarios definen project_name y es un atributo del modelo Project.

Agregué un validador en project_name para verificar si está en minúsculas. Por lo tanto, todos los nombres nuevos están en minúsculas, pero algunos nombres antiguos incluyen caracteres en mayúscula.

Me gustaría cambiar todos los nombres almacenados para que sean minúsculas, pero al mismo tiempo, no quiero que los usuarios obtengan un error al intentar acceder a una de las URL con el nombre del proyecto anterior, incluidos los caracteres en mayúscula. Como tengo muchas URL y muchas vistas, no quiero actualizar cada una manualmente para .lower() la project_name.

¿Hay alguna manera de redirigir todas las URL incluyendo /<project_NAME>/ a /<project_name>/?

1
Melissa 5 may. 2020 a las 13:37

2 respuestas

Hacky way con decoradoras

Puede crear un decorador para todas sus vistas que utilicen un project_name:

def project_lowercase(_func=None):
    def checkLowercase(func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            request = args[0]
            project_name = args[1]
            if not project_name.islower():
                return HttpResponseRedirect(reverse(your_url_name, kwargs{'project_name' = project_name.lower()))
            return func(*args, **kwargs)
        return wrapper
    return checkLowercase(_func)

Reemplace your_url_name con lo que haya llamado su ruta de URL, luego importe la función y agregue el decorador sobre cada función de vista:

@project_lowercase
def view_project(request, project_name):
    # ...
    return "Hello World!"

Las babosas serían mejores

Alternativamente, como se sugiere en los comentarios y una mejor solución, debe usar un slug para almacenar las URL de sus proyectos, eche un vistazo aquí para ver cómo agregarlos a sus modelos y generar babosas.

Para mover sus datos existentes para usar babosas o simplemente para actualizar nombres de proyectos, puede crear un migración de datos que alterará los datos existentes en su base de datos.

0
GTBebbo 5 may. 2020 a las 11:02

La primera opción que sugeriría es evitar expresiones regulares, cambiar a ruta para su urlpatterns y use convertidor de URL personalizado para los nombres de sus proyectos.

En caso de que quiera seguir usando expresiones regulares, puede restringir su patrón para que solo acepte nombres de proyecto en minúsculas /(?P<project_name>[_a-z0-9]+)/. Después de eso, agregue el patrón de URL, que es (efectivamente) el mismo que el actual /(?P<project_name>\w+)/ (nota que falta _ - \w ya incluye eso) para que coincida con todos los nombres de proyectos, incluidos los heredados , la vista para ese patrón redirigirá a su primera vista con minúsculas project_name.

0
zaquest 5 may. 2020 a las 11:01