我正试图在我的网站上实现一个简单友好的地址系统。
我在想的是当用户登录时,他的用户名将显示在地址栏中。
- 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
等示例进行操作但我还没有工作呢。我不明白该怎么做:(
请提供一些建议。
答案 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}}