Nano Hash - криптовалюты, майнинг, программирование

Пользовательский вход в Django - форма действительна, но без ошибок

В настоящее время я пытаюсь выяснить, как настроить базовую функцию входа пользователя Django, чтобы добавить, например. простая капча.

Я создал подкласс "AuthenticationForm" из django.contrib.auth.forms, который сначала выглядит великолепно, но если я попытаюсь войти в систему, я просто не смогу.

Я уже отладил код, и в настоящее время я получаю только:

response = wrapd_callback(request, *callback_args, **callback_kwargs) TypeError: init() принимает 1 позиционный аргумент, но было задано 2

accounts/views.py:

...

форма входа django.contrib.auth.forms, подклассифицированная (скопированная) в account/forms.py:

...

urls.py:

...

Ответы:


1

когда я использовал способ vorujack, я сделал ошибку, наконец, я нашел решение

в URL

from django.contrib.auth import views as auth_views

path('login/',auth_views.LoginView.as_view(form_class=forms.new_login_form,
    template_name='login.html'), name='login'),

в формах

from django.contrib.auth.forms import AuthenticationForm
class new_login_form(AuthenticationForm):
    captcha = CaptchaField(label='验证码', error_messages={"invalid": "验证码错误"})

    class Meta:
        model = User
        fields = ('username', 'password',)
01.04.2019
  • лучший ответ :) 29.04.2021

  • 2

    Здесь есть несколько неправильных вещей.

    Основной из них заключается в том, что вы переопределили сигнатуру инициализации класса, так что первый позиционный аргумент равен request, но вы передаете данные POST в этой позиции; следовательно, форма никогда не будет связана и никогда не будет действительной.

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

    Соединяем их вместе:

    def login (request):
        if request.method == 'POST':
            form = LoginForm(request, data=request.POST)
            if form.is_valid():
                form.save()
                messages.add_message(request, messages.INFO, "You are now logged-In, welcome")
                return redirect(reverse('post_list'))
        else:
            form = LoginForm(request)
    
            args = {'form': form}
        return render(request, 'registration/login.html', args)
    

    Обратите внимание, вам не нужен второй блок else; единственный здесь выровнен с первым if, а последний return попадает в обоих случаях.

    26.08.2018
  • Эй, я только что попробовал ваше решение, но я получаю: объект «LoginForm» не имеет атрибута «сохранить». Я думаю, что на самом деле мне это даже не нужно. Если я удалю его, я просто не войду в систему и буду перенаправлен в список сообщений. 26.08.2018
  • вы не вошли в систему. вы только проверяете информацию о пользователе и перенаправляете на конкретного пользователя. проверьте в своем представлении, существует ли request.user и является ли он аутентифицированным пользователем или нет. 26.08.2018
  • @vorujack, мой взгляд теперь похож на пост Дэниела Роузмана. Не могли бы вы опубликовать свое решение? 26.08.2018
  • ››Объект «LoginForm» не имеет атрибута «сохранить»‹‹ Что мне нужно изменить в форме? Сорри, я еще новичок :( 27.08.2018
  • Я обновляю этот ответ, но вы просматриваете старый, потому что Дэниел не принимает его. 27.08.2018

  • 3

    как сказал Дэниел, вы обновляете метод init формы. поэтому вы должны передать запрос в качестве первого аргумента.

    во-вторых, когда вы проверяете информацию о пользователе, вы должны аутентифицировать пользователя с помощью бэкэнда аутентификации. но вы сохранили данные формы.

    если вы хотите изменить только форму аутентификации, вы можете использовать вид входа в систему, подобный этому

    см. ниже: urls.py

    ....
        url(r'^accounts/login/$', auth.login, {'authentication_form': LoginForm}, name='login'),
    ....
    

    если вы используете django2 и выше, вы можете изменить его следующим образом. прежде всего создайте представление на основе класса, расширенное из django.contrib.auth.views.LoginView в этом классе, установите form_class для него следующим образом.

    from django.conrtib.auth.views import LoginView
    ...
    class NewLoginView(LoginView):
        form_class = LoginForm
    

    то вы должны обновить свои URL-адреса следующим образом:

    ...
        url(r'^accounts/login/$', NewLoginView.as_view, name='login'),
    ...
    

    вы должны расширить свою форму от django.contrib.auth.forms.AuthenticationForm или вы должны реализовать все необходимые функции этого класса формы.

    26.08.2018
  • login() получил неожиданный ключевой аргумент 'authentication_form' 26.08.2018
  • ведьма версия Django вы используете 26.08.2018
  • Джанго 2.1 (текущая версия) 26.08.2018
  • Кроме того, это решение весьма нестандартно, потому что таким образом я не смогу добавить поле с капчей. использовать капчу, например. django-simple-captcha вам нужно внедрить его напрямую в форму, поэтому я хочу подклассировать это;) 26.08.2018
  • мое решение основано на django2.x. я обновляю решение для django2.1 27.08.2018
  • Это решение также не практично и не решает мою проблему. Как я уже упоминал в других решениях внизу, captcha = CaptchaField() - из импорта captcha.fields CaptchaField обрабатывается только в forms.py, и мне это понадобится позже. Либо я не могу аутентифицировать себя из-за того, что я не могу правильно субкализировать AuthenticationForm из contrib.auth, чтобы вставить поле с капчей, либо я привязан к этой внутренней фазе Django здесь... Где я могу изменить внешний вид, но без капчи. быть решением для правильного подкласса AuthenticationForm в моем собственном правом form.py 27.08.2018
  • если вы не хотите расширять свой класс формы от AuthenticationForm, вы должны реализовать все методы в этом классе. 27.08.2018
  • я думаю, я должен открыть новую тему на этом. Теперь у меня есть еще несколько вопросов. Спасибо вам всем 27.08.2018
  • Я думаю, у нас тут возникло недопонимание. Я только что реализовал материал, описанный выше, но я получаю: __init__() принимает 1 позиционный аргумент, но было дано 2. Я также обновил свой пост. 28.08.2018

  • 4

    Я наконец нашел решение, пуух :D

    просмотров.py:

    ...
    from django.contrib.auth import update_session_auth_hash, authenticate, login as customlogin
    ...
    
    def login(request):
        if request.method == 'POST':
            form = LoginForm(request.POST, request.POST)
            if form.is_valid():
                username = request.POST['username']
                password = request.POST['password']
                user = authenticate(request, username=username, password=password)
                if user is not None:
                    customlogin(request, user)
                    # Redirect to a success page.
                    return redirect(reverse('post_list'))
            return render(request, 'registration/login.html', {'form': form})
        else:
            return render(request, 'registration/login.html', {'form': LoginForm()})
    

    просто расширьте форму (спасибо vorujack)

    ...
    from django.contrib.auth.forms import AuthenticationForm
    ...
    class LoginForm (AuthenticationForm):
        captcha = CaptchaField()
    

    URL.py:

    url(r'^accounts/login/$', views_accounts.login, name='login'),
    

    действительно глупая часть - это функция входа в систему «form = LoginForm (request.POST, request.POST)». Вам действительно нужно передать это для пароля и пользователя, а также для этого и вторичного запроса. POST для формы с капчей ... Oookay . Во всяком случае, теперь это работает.

    Спасибо всем за вашу помощь, я очень ценю это сообщество

    28.08.2018
  • form = LoginForm(request.POST, request.POST). Что такое форма входа? Почему вы проходите POST дважды? 20.02.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..