【问题标题】:Django - how to implement an example.com/username url systemDjango - 如何实现 example.com/username url 系统
【发布时间】:2015-04-16 11:19:57
【问题描述】:

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

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

  • www.example.com/username1(用于主页配置文件)
  • www.example.com/username1/about/
  • www.example.com/username1/gallery/

  • www.example.com/username2(用于主页配置文件)
  • www.example.com/username2/about/
  • www.example.com/username2/gallery/

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

我已经使用 Django-Allauth 实现了一个注册/登录系统

mySite/urls.py

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

主页/urls.py

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

home/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

但我还没有这个东西工作。我不明白该怎么做:(

请给点建议。

【问题讨论】:

    标签: django url


    【解决方案1】:

    添加以下网址作为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):
        ...
    

    【讨论】:

    • 非常感谢!优秀的答案 Catavaran!
    • @catavaran 如果这个解决方案必须应用于已经工作的 django 应用程序怎么办。它不会导致很多变化吗?
    【解决方案2】:

    这几乎是完美的,但我有一个错误。让我解释。当我在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 = '/'

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

    【讨论】:

      【解决方案3】:

      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 写了正确的 url 导致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}}显示用户数据

      【讨论】:

        猜你喜欢
        • 2011-12-01
        • 1970-01-01
        • 2011-04-11
        • 2020-09-29
        • 2011-10-19
        • 2010-12-21
        • 2019-05-10
        • 2014-07-03
        • 1970-01-01
        相关资源
        最近更新 更多