появляется профиль другого пользователя

python django django-models django-views

39 просмотра

2 ответа

ID администратора равен 1, когда я открываю администратора на панели администратора. Аналогично, идентификатор michaelравен 2, но когда я нажимаю на значок профиля вместо того, чтобы показывать мне профиль администратора, я получаю профиль michael. Для того, чтобы получить идентификатор я использовал user.idиз requested user.

Также проблема в том, что я не мог использовать слизень в такой модели.

ресторан / 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})

Как я могу использовать slug для такой модели, чтобы в админ-панели slug для этого пользователя автоматически сохранялся? Потому что нет метода записи.

Но главная проблема в том, что я получаю профиль пользователя другого пользователя.

Автор: Serenity Источник Размещён: 08.11.2019 11:25

Ответы (2)


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является целым числом.

Автор: dvtan Размещён: 20.08.2016 03:06

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

Я заполнил значение слизня таким образом.

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)
Автор: Serenity Размещён: 21.08.2016 05:19
Вопросы из категории :
32x32