Страница суперпользователя Django не найдена

#django

#django

Вопрос:

Если я присвою пользователю статус суперпользователя или создам нового суперпользователя, этот пользователь не откроет свою собственную страницу профиля. Получаем сообщение об ошибке страница не найдена, одновременно открывается панель администратора. Все остальные функции на сайте, такие как логин и комментирование, он также выполняет без проблем, но собственная страница пользователя не открывается

Страница не найдена (404) Метод запроса: ПОЛУЧИТЬ URL-адрес запроса: http://127.0.0.1:8000/profile/6 / Привлечено: профили.просмотры.профили

views.py:

 def profiles(request, pk=0):
post_form = ArticleForm()
now_user = Profile.objects.get(user=request.user) # require user
posts = Article.objects.filter(author=now_user) # posts require users
profile = Profile.objects.get(id=pk) # users not require 
posts_other = profile.author.all() # posts not require users

# count comment for not request user
comm_post = get_object_or_404(Article, id=pk)
comm = comm_post.comments_post.all()
count_com = comm.count()

# count comment for request user
#------

if request.method == "POST":
    post_form = ArticleForm(request.POST, request.FILES)
    if post_form.is_valid():
        new_post = post_form.save(commit=False)
        now_user = Profile.objects.get(user=request.user)
        new_post.author = now_user
        new_post.save()
        return HttpResponseRedirect(f'/profile/{pk}')


context = {  'profile':profile, 
             'posts_other':posts_other,
             'post_form' : post_form,
             'posts' : posts,
             'count_com':count_com,
           
             }
return render(request, 'profiles/account.html', context)
 

models.py:

 class Profile(models.Model):
    first_name = models.CharField(max_length=200, blank=True)
    last_name  = models.CharField(max_length=200, blank=True)
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    email = models.EmailField(max_length=150, blank=True)
    country = models.CharField(max_length=100, blank=True)
    about = models.TextField(blank=True, null=True)
    avatar = models.ImageField(default = 'avatar.svg', upload_to = 'avatars/%Y/%m/%d', blank=True, null=True)
    friends = models.ManyToManyField(User, blank=True, related_name='friends')
    update = models.DateTimeField(auto_now=True)
    created = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"{self.user}"


    @receiver(post_save, sender=User)
    def update_user_profile(sender, instance, created, **kwargs):
        if created:
            Profile.objects.create(user=instance)
        instance.profile.save()
 

template.html:

       {% if profile.user == request.user %}
              <img src="{{user.profile.avatar.url}}" class="img-fluid" width="350px" />
                <a href="{% url 'change_avatar' profile.id %}"
                  class="btn btn-sm btn-succes card-body container "
                  type="submit"/>
                  Change avatar</a>
            <div class="card-body center">
              <h5 class="card-title">{{user.username}}</h5>
              <p class="card-text">
                <p>registered {{user.profile.created|date:'Y-m-d'}}</p>
                <p class="card-text">about: {{user.profile.about}}</p>
              </p >
              <a  href="#" class="btn btn-primary btn-sm "> Friends </a>
              <a href="{% url 'postman:inbox' %}" class="btn btn-info btn-sm "
                >messages</a>
            </div>
    
              <!--****************Profile  not request ******************-->
                        {% else %}
            <img src="{{profile.avatar.url}}" class="img-fluid" width="350px" />
    
            <div class="card-body center">
              <h5 class="card-title">{{profile.user}}</h5>
              <p class="card-text">
                 <p>registered {{user.profile.created|date:'Y-m-d'}}</p>
                 <p class="card-text">about: {{user.profile.about}}</p>
              </p>
              <a href="#" class="btn btn-primary btn-sm">add to friend</a>
              
              <a href="{% url 'postman:write' %}"  class="btn btn-info btn-sm mt-1">send a message</a>
               
            </div>
             {% endif %}
 

вход в систему.просмотр

 def login(request, id=0):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        user = auth.authenticate(username=username, password=password)
        try:
            remember = request.POST['remember_me']
            if remember:
                settings.SESSION_EXPIRE_AT_BROWSER_CLOSE = False
        except:
            is_private = False
            settings.SESSION_EXPIRE_AT_BROWSER_CLOSE = True

        if user is not None:
            auth.login(request, user)

            return redirect('profile',  id = user.id)
        else:
            messages.info(request, 'invalid credentials')
            return redirect('login')
    else:
        return render(request, 'registration/login.html')
 

Комментарии:

1. Пожалуйста, поделитесь полной трассировкой ошибок.

2. ошибка sharred full

3. Можете ли вы затем добавить свой полный код def profiles() ?

4. почему вы используете pk= 0 по умолчанию здесь def profiles(запрос, pk = 0)?

5. @MrHow, используйте try except block вместо get_object_or_404 этого, если какой-то объект не является существенным. И вы можете продолжать использовать pk=0 или pk=None , если аргумент является необязательным.

Ответ №1:

@Mr. How- Во-первых, у вас есть серьезный недостаток в вашем приложении, на который указывают другие пользователи в комментариях. Передача по умолчанию pk = 0. Не делайте этого. Ошибка, которую вы получаете, показывает, что профиль не существует с этим id = 6. Если вы считаете, что она существует, зарегистрируйте набор запросов в представлении профилей и покажите нам. Основные недостатки —

  1. Использование pk в ваших URL-адресах. Это плохая практика. Вы можете использовать slug или какой-то UUID, который является случайным. Не используйте последовательный идентификатор, так как другие пользователи смогут изменить идентификатор в URL, получить профили других пользователей и начать редактирование, если у вас нет какой-либо логики, чтобы предотвратить это.
  2. Далее, что произойдет, если профиль не существует. Если пользователь создал учетную запись, у него / нее должен быть профиль. Если профиль отсутствует, проверьте post_save()

Я добавляю некоторые изменения в ваши модели и представления.

   class Profile(models.Model):
    profile_id = models.UUIDField(default=uuid.uuid4, editable=False, unique=True,db_index=True)
 ....................


 def ProfileDetailView(request,profile_id):
    profile = Profile.objects.get(profile_id=profile_id)
    context = {  'profile':profile, 
                ...}
    return render(request, 'profiles/account.html', context)



 url(r'^(profile/?P<profile_id>[0-9a-f-] )/detail/


Комментарии:

1. @MrHow- я отредактировал код. Посмотрите

2. @MrHow- Не могли бы вы немного уточнить свой вопрос?

3. @MrHow- Ваш ProfileDetailView отобразит html-шаблон, содержащий данные вашего профиля. Почему вы хотите перенаправить? рендеринг должен работать нормально.

4. @MrHow- profile_id = модели. CharField (по умолчанию = uuid.uuid4, редактируемый = False, уникальный = True, db_index = True, max_length = 200) .... измените его на это

5. Почему вы сначала передаете значение по умолчанию pk = 0? Какой цели это служит? @MrHow

, login_required(views.ProfileDetailView),
name='profile-detail'),
path('profile/<uuid:profile_id>/detail/', views.ProfileDetailView)

Комментарии:

1. @MrHow- я отредактировал код. Посмотрите

2. @MrHow- Не могли бы вы немного уточнить свой вопрос?

3. @MrHow- Ваш ProfileDetailView отобразит html-шаблон, содержащий данные вашего профиля. Почему вы хотите перенаправить? рендеринг должен работать нормально.

4. @MrHow- profile_id = модели. CharField (по умолчанию = uuid.uuid4, редактируемый = False, уникальный = True, db_index = True, max_length = 200) …. измените его на это

5. Почему вы сначала передаете значение по умолчанию pk = 0? Какой цели это служит? @MrHow