2016-08-20 70 views
0

管理員的ID是當我在管理面板中打開管理員用戶。同樣,michael的編號是但是當我點擊配置文件圖標而不是顯示管理員的配置文件時,我獲得了michael的配置文件。爲了得到我使用的編號爲requested useruser.id其他用戶的用戶檔案顯示

另外問題是我不能在這種模型中使用slu slu。

餐廳/ base.html文件

{% 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/urls.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/views.py

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/profile.html

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

的UserProfiles/models.py

class UserProfile(models.Model): 
    user = models.OneToOneField(User) 
    restaurant = models.ManyToManyField(Restaurant) 
    order_history = models.ManyToManyField(OrderMenu) 
    # favorites = models.ManyToManyField(Restaurant) 
    is_owner = models.BooleanField(default=False) 

    class Meta: 
     def __str__(self): 
      return self.user.username 

    # def get_absolute_url(self): 
    # return reverse('userprofiles:profile', kwargs={'slug':self.slug, 'id':self.id}) 

如何使用金屬塊對於這樣的模型,以便在管理面板該用戶的段塞被自動保存?因爲沒有post方法。

但主要問題是我正在獲取其他用戶的userprofile。

+0

如果你創建了一個id = 3的第三個用戶,你會得到Michael嗎? – dtgq

+0

有3個用戶。一位管理員,一位邁克爾和另一位匿名。如果我做http:// localhost:8000/userprofiles/profile/1 /我得到michael的用戶配置文件和/ 2 /顯示匿名和/ 3 /顯示404錯誤的用戶配置文件。 – Serenity

+0

在管理面板中,我檢查了用戶admin的ID是1,michael是2,匿名是3. – Serenity

回答

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是一個整數。

+0

如果我用slug代替id,該怎麼辦?但我認爲如果我使用slug,我必須使用pre_save信號來保存user.username名稱中的slug。我對嗎? – Serenity

+0

好的,在這種情況下,你會在你的模型中創建一個slug字段,並且你可以在任何你保存實例的地方設置slug字段,如果你願意,你可以在pre_save中完成。你也必須讓url路由器傳遞給你的視圖,而不是整數。 – dtgq

+1

我發佈我的新解決方案的答案,但我標記你的答案爲答案。謝謝你的幫助。 – Serenity

0

我用slu instead代替id和使用slu i我已經使用pre_save信號,其中slu value值取自用戶名。

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}) 

我用這種方式填補了slu value的價值。

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)