显示其他用户的用户个人资料

时间:2016-08-20 14:22:43

标签: python django django-models django-views

当我在管理面板上打开管理员用户时,管理员的ID为 1 。同样,michael的ID为 2 ,但是当我点击个人资料图标而不是向我显示管理员的个人资料时,我会获得michael的个人资料。要获取ID,我使用了user.id的{​​{1}}。

另外问题是我不能在这种模型中使用slug。

餐厅/ base.html文件

requested user

的UserProfiles / urls.py

{% if user.is_authenticated %}
    <li class="nav-item">
        <a class="nav-link user-icon" href="{% url 'userprofiles:profile' user.id %}">
          <i class="fa fa-user"></i>
        </a>
    </li>
{% else %}

的UserProfiles / views.py

urlpatterns = [
    # url(r'^profile/(?P<profile_name>[-\w]+)/(?P<profile_id>\d+)/$', views.profile, name='profile'),
    url(
        r'^profile/(?P<profile_id>\d+)/$', 
        views.profile, 
        name='profile'
    ),

]

的UserProfiles / profile.html

def profile(request, profile_id):
    if profile_id is "0":
        userProfile = get_object_or_404(UserProfile, pk=profile_id)
    else:
        userProfile = get_object_or_404(UserProfile, pk=profile_id)
        user_restaurant = userProfile.restaurant.all()
        user_order = userProfile.order_history.all()
        total_purchase = 0
        for ur in user_order:
            total_purchase += ur.get_cost()
    return render(
                  request, 
                  'userprofiles/profile.html',
                  {
                   'userProfile':userProfile,
                   'user_restaurant':user_restaurant,
                   'user_order':user_order,
                   'total_purchase':total_purchase
                  }
           )

的UserProfiles / models.py

{% for user_restaurant in user_restaurant %}
        {{user_restaurant.name}}<br/>
        {{user_restaurant.address }}
{% endfor %}

我如何使用slug这样的模型,以便在管理面板中自动保存该用户的slug?因为没有post方法。

但主要问题是我正在获得另一个用户的用户配置文件。

2 个答案:

答案 0 :(得分:0)

只需在您使用1

的任何地方添加profile_id即可
def profile(request, profile_id):
    if profile_id is "0": # Is profile_id a string or integer?
        userProfile = get_object_or_404(UserProfile, pk=(profile_id+1)) # What does this do?
    else:
        userProfile = get_object_or_404(UserProfile, pk=(profile_id+1))
        user_restaurant = userProfile.restaurant.all()
        user_order = userProfile.order_history.all()
        total_purchase = 0
        for ur in user_order:
            total_purchase += ur.get_cost()
    return render(request, 'userprofiles/profile.html', {'userProfile':userProfile, 
                                                        'user_restaurant':user_restaurant,
                                                        'user_order':user_order,
                                                        'total_purchase':total_purchase })

我怀疑你的代码中某处有一个n-1问题(即计算机开始计数为0但人类开始计数为1)。我还没有确切地找到它的位置,但在此期间这可能会起到绷带解决方案的作用。

此外,我不确定代码中if的作用,如果profile_id是整数,它似乎永远不会被使用。

答案 1 :(得分:0)

我使用了slug而不是id而使用slug我使用了pre_save信号,其中slug值来自用户名。

def profile(request, profile_slug):
    if profile_slug is None:
        userprofile = get_object_or_404(UserProfile,slug=profile_slug)
    else:
        userprofile = get_object_or_404(UserProfile, slug=profile_slug)
        user_restaurant = userprofile.restaurant.all()
        user_order = userprofile.order_history.all()
        total_purchase = userprofile.total_purchase
    return render(request, 'userprofiles/profile.html', {'userprofile':userprofile, 
                                                        'user_restaurant':user_restaurant,
                                                        'user_order':user_order,
                                                        'total_purchase':total_purchase})

我用这种方式填充了slug的价值。

def create_slug(instance, new_slug=None):
    print('instance',instance.user)
    slug = slugify(instance.user.username)
    if new_slug is not None:
        slug = new_slug
    qs = UserProfile.objects.filter(slug=slug).order_by("-id")
    exists = qs.exists()
    if exists:
        new_slug = "%s-%s" %(slug, qs.first().id)
        return create_slug(instance, new_slug=new_slug)
    return slug


def pre_save_post_receiver(sender, instance, *args, **kwargs):
    if not instance.slug:
        instance.slug = create_slug(instance)

from django.db.models.signals import pre_save
pre_save.connect(pre_save_post_receiver, sender=UserProfile)