Django – após o login, redirect o usuário para sua página personalizada -> mysite.com/username

Por padrão, após o login, o django redireciona o usuário para uma página de contas / perfil ou, se você editar o LOGIN_REDIRECT_URL, pode enviar o usuário para outra página que você especificar no arquivo settings.py.

Isso é ótimo, mas eu gostaria que o usuário (após o login) fosse redirecionado para uma página personalizada onde o link para essa página seria algo como: mysite.com/username . Portanto, as contas / perfil padrão ou as configurações LOGIN_REDIRECT_URL não funcionariam nesse caso, já que ambas são de alguma forma estáticas. No meu caso, a seção de username de username do endereço muda para cada usuário.

Qualquer idéia de como eu posso fazer isso quando o usuário está logado iria para uma página de usuário personalizada que tem o nome do usuário no endereço como: mysite.com/username ? Qualquer input é realmente apreciada.

    Você pode autenticar e registrar o usuário como indicado aqui: http://docs.djangoproject.com/en/dev/topics/auth/#how-to-log-a-user-in

    Isso lhe dará access ao object Usuário do qual você pode obter o nome de usuário e, em seguida, fazer um HttpResponseRedirect para o URL personalizado.

    Uma abordagem mais simples depende do redirecionamento da página LOGIN_REDIRECT_URL . A principal coisa a perceber é que as informações do usuário são incluídas automaticamente na solicitação.

    Suponha que:

     LOGIN_REDIRECT_URL = '/profiles/home' 

    e você configurou um urlpattern:

     (r'^profiles/home', home), 

    Então, tudo que você precisa escrever para a view home() é:

     from django.http import HttpResponseRedirect from django.core.urlresolvers import reverse from django.contrib.auth.decorators import login_required @login_required def home(request): return HttpResponseRedirect( reverse(NAME_OF_PROFILE_VIEW, args=[request.user.username])) 

    onde NAME_OF_PROFILE_VIEW é o nome do retorno de chamada que você está usando. Com os perfis do django, NAME_OF_PROFILE_VIEW pode ser ‘profiles_profile_detail’.

    Sim! Em seu settings.py defina o seguinte

     LOGIN_REDIRECT_URL = '/your-path' 

    E ter ‘/ your-path’ um simples View que procura por self.request.user e faz toda a lógica necessária para retornar um object HttpResponseRedirect .

    Uma maneira melhor seria definir uma URL simples como '/simple' que faz a lógica de pesquisa lá. O URL parece mais bonito, poupa algum trabalho, etc.

    Se você estiver usando o LoginView integrado do Django, ele será substituído pelo contexto, que é “A URL para redirect depois do login bem login sucedido. Isso também pode conter uma string de consulta”. (ver docs )

    Também da documentação:

    “Se o login for bem-sucedido, a visualização redireciona para o URL especificado no next . Se o próximo não for fornecido, ele será redirecionado para as settings.LOGIN_REDIRECT_URL (cujo padrão é / accounts / profile /).”

    Exemplo de código:

    urls.py

     from django.urls import path from django.contrib.auth import views as auth_views from account.forms import LoginForm # optional form to pass to view urlpatterns = [ ... # --------------- login url/view ------------------- path('account/login/', auth_views.LoginView.as_view( template_name='login.html', authentication_form=LoginForm, extra_context={ # option 1: provide full path 'next': '/account/my_custom_url/', # option 2: just provide the name of the url # 'next': 'custom_url_name', }, ), name='login'), ... ] 

    login.html

     ... 
    ... {# option 1 #} {# option 2 #} {# #}

    Entrei no django recentemente e estive procurando uma solução para isso e encontrei um método que poderia ser útil.

    Por exemplo, se usar allouth, o redirecionamento padrão é account / profile. Faça uma visão que redireciona apenas para um local de escolha usando o campo de nome de usuário da seguinte forma:

     def profile(request): name=request.user.username return redirect('--choose where--/' + name + '/') 

    Em seguida, crie uma visualização que capture em um dos seus aplicativos, por exemplo:

     def profile(request, name): user = get_object_or_404(User, username=name) return render(request, 'myproject/user.html', {'profile': user}) 

    Onde a captura de padrões de url seria assim:

     url(r'^(?P.+)/$', views.profile, name='user') 

    Funciona bem para mim.

     return render(request,'page_location/page_name') return render(request,'home/page-login.html')