Ошибка поднятия слизни Джанго - PullRequest
0 голосов
/ 16 мая 2018

Я работаю над проектом django (Django v2.0), в котором есть пользователи из разных групп, эта группа настроена в профиле пользователя. Я хотел бы сделать веб-сайт более личным и иметь группу пользователей в начале URL-адреса веб-сайта (добавляемого через слаг) после входа в систему.

В идеале, когда они войдут в систему, они будут перенаправлены на нужную страницу с этим слагом в начале URL. На странице входа в систему я получаю доступ к группе пользователей, эта группа вызывается и с этого момента будет называться отрядом, чтобы свести к минимуму путаницу с группами Django. Вот мой вид записи класса входа, где я получаю это:

def post(self, request):
    def normal_user(user):
        return user.groups.filter(name='Normal_User').exists()

    username = request.POST['username']
    password = request.POST['password']
    user = authenticate(request, username=username, password=password)
    if user is not None:
        login(request, user)
        if normal_user(user):
            redirecting_url = 'accounts:home'
        elif user.is_superuser:
            redirecting_url = 'admin:index'


        slug = user.userprofile.troop

        return redirect(redirecting_url, slug=slug)
    else:
        form = AuthenticationForm()
        error = True
        args = {'form': form, 'error': error}
        return render(request, self.template_name, args)

В этом случае я пытаюсь получить доступ к URL-адресу «account», который я назвал «home» и который находится в моем приложении «account».

Моя домашняя функция в views.py в учетных записях приложения имеет следующий код:

def home(request, slug):

args = {'user': request.user}
return render(request, 'accounts/home.html', args)

Я не хочу ничего делать со слагом, кроме отображения его в URL. Мой шаблон выглядит так:

 <div class="container">
 <br>
 <h2><strong>Your Progress:</strong></h2><br>
 <h3>
 <a href="{% url 'accounts:progress_page' slug=instance.slug %}" style="color:red"><strong>50% progress</strong></a>
<div class="progress">
<div class="progress-bar bg-danger progress-bar-striped progress-bar- 
animated" role="progressbar" style="width:50%" aria-valuenow="50" aria- 
valuemin="0" aria-valuemax="100">50%</div> </div>
</div></h3>
<br><br>
{% endblock %}

У меня также есть ссылка на 'home' в моей панели навигации, и я связываю ее аналогично ссылке выше, используя {% url 'account: home' slug = instance.slug%} В настоящее время у меня появляется следующая ошибка: "NoReverseMatch в / BC / account / Реверс для 'home' с ключевыми словами '{' slug ':' '}' не найден. Попробован 1 шаблон (ов): ['(? P [-a-zA-Z0-9 _] +) / account / $'] " Слизень в этом случае - «BC».

Мой urls.py выглядит так: В корневой папке:

main_urls = [
path('leaders/admin/', admin.site.urls),
path('account/', include('accounts.urls', namespace='accounts'))

]


urlpatterns = [
    path('', include('home.urls', namespace='home_page')),
    path('login/',  include('login.urls', namespace='login')),
    path('<slug:slug>/', include(main_urls))
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

А мой urls.py в приложении для моих учетных записей выглядит примерно так:

app_name="accounts"

urlpatterns = [
    path('', views.home, name="home")
]

Извините за длинное описание, но я читал все возможные сайты / видео, которые я мог найти на слизняках Django, и пока не смог найти ничего, что работает Может ли кто-нибудь помочь мне с этой проблемой?

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

После просмотра моего кода я нашел что-то, что работает. Похоже, это то, что я должен иметь возможность иметь представления, которые принимают аргумент slug, пока он работает, если slug пуст. Чтобы исправить это, все, что я сделал, это изменил часть slug в определениях моих функций просмотра на **kwargs. Затем я добавил переменную, которая открывала доступ к слагу и передавала его через мои шаблоны, когда у меня была ссылка. Например:

def home(request, **kwargs):
    slug = request.user.userprofile.troop
    args = {'slug_arg': slug}
    return render(request, 'accounts/home.html', args)

Мои ссылки в моих шаблонах выглядят так: {% url 'accounts:home' slug=slug_arg %}


Редактировать Я обнаружил, что проблема заключалась в том, что во время рендеринга я мог проходить через слаг, и в этом случае slug=instance.slug не работал и иногда выдавался пустым. Однако, если у меня это в slug=request.user.userprofile.troop, тогда это работает без необходимости принимать аргумент из представления.


Сказав это, я не могу сделать это для сайта администратора, так как я не знаю, как получить доступ к views.py для администратора и, таким образом, добавить параметр для принятия в слаг.

0 голосов
/ 16 мая 2018

Ваше регулярное выражение для вашего URL требует, чтобы слаг был длиной не менее одного символа.Однако полученное вами исключение предполагает, что имя troop (которое используется в качестве именованного аргумента slug) пусто:

Reverse for 'home' with keyword arguments '{'slug': ''}'

Если пользователь не требуетсячтобы иметь отряд , в этом случае вы просто хотите перенаправить его на /accounts/ вместо /troop/accounts, я предлагаю вам добавить отдельный URL-адрес только для accounts/$ или настроить регулярное выражение, чтобыпустой отряд .

...