Почему имена пользователей с заглавными буквами вызывают ошибки Django - PullRequest
1 голос
/ 14 марта 2020

У меня есть веб-сайт, на котором пользователи могут регистрироваться и дружить друг с другом. Однако я заметил, что пользователи с заглавными буквами в именах вызывают ошибки, когда пользователи пытаются подружиться с ними. Просто появляется страница 404, и я понял, почему это так, а не как ее исправить.

models.py

class UserProfileInfo(models.Model):
    MALE = 'Male'
    FEMALE = 'Female'

    GENDER = [
        (MALE, 'Male'),
        (FEMALE, 'Female'),
    ]

    user = models.OneToOneField(User, on_delete=models.CASCADE,max_length=30)
    description = models.TextField(max_length=150)
    slug = models.SlugField(unique=True,allow_unicode=True)
    def __str__(self):
        return f'{self.user.username}'

    def get_absolute_url(self):
        kwargs = {
            'username':self.user.username,
        }
        return reverse('mainapp:view_profile_with_pk',kwargs=kwargs)
        # return reverse('mainapp:post_list')

    def save(self, *args, **kwargs):
        # slugl = self.slug.lower()
        self.slug = slugify(self.user.username)
        super().save(*args, **kwargs)

И мои взгляды на добавление друзей

class AddFriendRedirect(RedirectView):
    def get_redirect_url(self,*args,**kwargs):
        username = self.kwargs.get("username")
        obj = get_object_or_404(UserProfileInfo,slug=username)
        # print(f'OBJECT: {other}')
        # print(f'Current user: {self.request.user}')
        # user_profile = User.objects.get(username=username)
        url_ = obj.get_absolute_url()
        user = self.request.user
        user_ = self.request.user.username
        # user__ = 
        if user.is_authenticated:
            print("User is authenticated")
            if user in obj.friends.all():
                obj.friends.remove(user)
                obj.save()
            else:
                obj.friends.add(user)
                obj.save()

        return url_

И, наконец, шаблон URL

    # path('profile/<str:username>/add/',views.AddFriendRedirect.as_view(),name='add_friend'),
    re_path(r'^profile/(?P<username>[\w.@+-]+)/add/$(?i)',views.AddFriendRedirect.as_view(),name='add_friend'),

А теперь для пользователей с заглавными буквами в именах.

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

Их страница профиля, путь которой path('profile/<str:username>/',views.view_profile,name='view_profile_with_pk'),, работает отлично, без ошибок. Я озадачен, почему это не работает.

1 Ответ

1 голос
/ 14 марта 2020

Я думаю, что проблема здесь

obj = get_object_or_404(UserProfileInfo,slug=username)

Измените его на

obj = get_object_or_404(UserProfileInfo,user__username=username)

Ваш слаг сохранен здесь в нижнем регистре self.slug = slugify(self.user.username), поэтому, когда вы пытаетесь получить UserProfileInfo с slug=username и username имеет заглавные буквы, которые выбрасывают 404.

...