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

Ключевая ошибка при использовании хрустящих форм django для входа в систему

Я пытался создать форму входа в django, используя хрустящие формы. Во время аутентификации у меня есть два поля: email_id и пароль. но в браузере отображается только поле пароля и возникает следующая ошибка:

Джанго версия 1.7.

WARNING:root:Could not resolve form field 'email_id'.
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/crispy_forms/utils.py", line 74, in render_field
    field_instance = form.fields[field]
KeyError: u'email_id'

Снимок отображаемой веб-страницы:

Снимок отображаемой страницы

Модель пользователя, для которого я пытаюсь войти: model.py

class User(models.Model):
    user_id = models.AutoField(primary_key=True)
    title_id = models.ForeignKey('Title')
    first_name = models.CharField(max_length=100)
    middle_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)
    username = models.CharField(max_length=100, unique=True, default='')
    password = models.CharField(max_length=100)  # will be changed according to hash used
    mobile_number = models.CharField(max_length=10)
    alternate_number = models.CharField(max_length=10)
    email_id = models.EmailField()
    date_of_birth = models.DateField()
    profession_id = models.ForeignKey('Profession')
    house_no = models.CharField(max_length=100)
    city_id = models.ForeignKey('City')
    country_id = models.ForeignKey('Country')
    state_id = models.ForeignKey('State')
    locality_id = models.ForeignKey('Locality')

Класс для входа в файл view.py:

class LoginView(generic.FormView):
    form_class = LoginForm
    success_url = reverse_lazy('profile')
    template_name = 'login.html'
    #model = User

    def form_valid(self, form):
        email_id = form.cleaned_data['email_id']
        password = form.cleaned_data['password']
        user = authenticate(email_id=email_id, password=password)
        if user is not None and user.is_active:
            login(self.request, user)
            return super(LoginView, self).form_valid(form)
        else:
            return self.form_invalid(form)

Класс для формы входа в forms.py:

class LoginForm(AuthenticationForm):
    def __init__(self, *args, **kwargs):
        super(LoginForm, self).__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.layout = Layout(
            'email_id',
            'password',
            ButtonHolder(
                Submit('login', 'Login', css_class= 'btn-primary')
            )
        )

  • Вы случайно не импортируете встроенную модель django.contrib.auth.models.User? 17.12.2014
  • @trpt4him Нет, я не использую встроенную модель пользователя. 17.12.2014

Ответы:


1

Из того, что я вижу (я делаю обоснованное предположение, поскольку вы нигде не включали свой импорт), вы используете django.contrib.auth.forms.AuthenticationForm в качестве родительского класса для вашего класса LoginForm, который используется в LoginView.

Единственными двумя полями в классе AuthenticationForm являются username и password, но вы пытаетесь получить доступ к полю email_id в своем объекте Layout в LoginForm.__init__. Это не сработает, потому что нет поля с именем email_id для доступа.

Поле password появляется на вашей странице, потому что на AuthenticationForm есть поле password, но если вы хотите добавить email_id, вам потребуется:

  • добавьте email_id в качестве поля формы в свой класс LoginForm или
  • создайте ModelForm, используя вашу модель User, или
  • прочитайте это руководство на как указать пользовательскую модель пользователя и шаги, необходимые для интеграции с приложением аутентификации django (я думаю, это то, что вы хотите)

Я не уверен, пытаетесь ли вы создать пользовательскую модель пользователя или нет, но поскольку вы, кажется, используете функцию django.contrib.auth.authenticate в своем представлении (опять же, обоснованное предположение, поскольку импорта нет), то кажется, что вы не по правильному образцу.

17.12.2014
Новые материалы

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

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

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

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

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

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

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