2014-12-16 5 views
1

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

Джанго версия 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' 

Снимок веб-страницы, визуализируется как:

Snapshot of page being rendered

Модель Пользователь, для которого я пытаюсь войти, является: 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') 
      ) 
     ) 
+1

Вы не можете импортировать встроенную модель 'django.contrib.auth.models.User', не так ли? – trpt4him

+0

@ trpt4him Нет, я не использую встроенную модель пользователя – arglee

ответ

3

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

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

Поле password происходит, чтобы показать на странице, потому что есть password поле на AuthenticationForm, но если Вы желаете, чтобы добавить email_id, то вам нужно либо:

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

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

+0

Огромное вам спасибо – arglee

+0

Добро пожаловать! –

Смежные вопросы