Django - 如何实现example.com/username url系统

时间:2015-02-16 00:57:18

标签: django url username

我正试图在我的网站上实现一个简单友好的地址系统。

我在想的是当用户登录时,他的用户名将显示在地址栏中。

  
      
  • www.example.com/username 1 (对于主页个人资料)
  •   
  • www.example.com/username的 1 /约/
  •   
  • www.example.com/username的 1 /画廊/
  •   

  
      
  • www.example.com/username 2 (适用于首页配置文件)
  •   
  • www.example.com/username的 2 /约/
  •   
  • www.example.com/username的 2 /画廊/
  •   

此外,如果有人输入地址www.example.com/username1,将显示user1的个人资料。

我已经使用Django-Allauth

实现了一个注册/登录系统
  

MYSITE / urls.py

url(r'^accounts/', include('allauth.urls')),
  

家/ urls.py

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

家/ views.py

def index(request):

return render_to_response('home/index.html', context_instance=RequestContext(request))

我尝试按照Facing problem with user profile url scheme like example.com/username in django

等示例进行操作

但我还没有工作呢。我不明白该怎么做:(

请提供一些建议。

3 个答案:

答案 0 :(得分:5)

将以下网址添加为mySite/urls.py最后项:

urlpatterns = patterns('',
    ...
    url(r'^(?P<username>\w+)/', include('userapp.urls')),
)

然后username参数将传递到userapp的视图:

userapp/urls.py

from userapp import views

urlpatterns = patterns('',
    url(r'^$', views.profile, name='user_profile'),
    url(r'^about/$', views.about, name='user_about'),
    url(r'^gallery/$', views.gallery, name='user_gallery'),
)

userapp/views.py

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

def about(request, username):
    ...

def gallery(request, username):
    ...

答案 1 :(得分:1)

它几乎是完美的,但我有一个错误。让我解释。当我在http://127.0.0.1:8000/accounts/login/上登录(我的登录系统是:django-allauth)时,我返回http://127.0.0.1:8000并出现错误404.

单击登录按钮时,我没有使用模板获取http://127.0.0.1:8000/username/

django-allauth的安装需要添加到settings.py

  

LOGIN_REDIRECT_URL =&#39; /&#39;

如何重定向到http://127.0.0.1:8000/username/并显示正确的模板?

答案 2 :(得分:0)

<强> 1。关于

  

如何重定向到

基于https://stackoverflow.com/a/20143515/4992248

的回答
# settings.py:
ACCOUNT_ADAPTER = 'project.your_app.allauth.AccountAdapter'

# project/your_app/allauth.py:
from allauth.account.adapter import DefaultAccountAdapter

class AccountAdapter(DefaultAccountAdapter):

  def get_login_redirect_url(self, request):
      return 'request.user.username'  # probably also needs to add slash(s)

最好使用get_absolute_url,即return 'request.user.get_absolute_url'。在这种情况下,您需要这样做:

# 1. Add `namespace` to `yoursite/urls.py`
urlpatterns = patterns('',
    ...
    url(r'^(?P<username>\w+)/', include('userapp.urls', namespace='profiles_username')),
)

# 2. Add the code below to the Users class in models.py
def get_absolute_url(self):
    # 'user_profile' is from the code shown by catavaran above
    return reverse('profiles_username:user_profile', args=[self.username])

<强> 2。关于

  

显示正确的模板

catavaran写了导致views.profile的正确网址,因此在view.py中你需要写一下:

from django.shortcuts import render

from .models import UserProfile  # import model, where username field exists
from .forms import UserProfileForm  # import Users form

def profiles(request, username):
    user = get_object_or_404(UserProfile, username=username)

    return render(request, 'home/profiles.html', {'user_profile_form': user})

在模板中(例如profiles.html),您可以通过{{user_profile_form.as_p}}

显示用户的数据