Вопрос

Я пытаюсь создать веб -сайт, где люди только размещают свои адреса электронной почты, и они вошли в систему с файлами cookie и все. На более позднем этапе я попрошу их предоставить пароль и имена, но не будет использоваться не имя пользователя. Я пытаюсь сделать это с Django-Registraition, но у меня ошибки, и у меня есть несколько проблем.

Сначала, чтобы отключить имена пользователей в качестве функции входа в систему, я положил str (time ()) вместо имени пользователя - я искал что -то, что будет меняться каждый раз.

Однако, когда я пропускаю аутентификацию (которая мне сейчас не нужна), я получаю ошибку:

'RegistrationProfile' object has no attribute 'backend'

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

auth.login(request, ProfileUser)

Если кто -то сможет вытащить меня отсюда, это было бы потрясающе. Вот какой -то код:

мой класс формы:

class RegistrationFormCustom(forms.Form):
email = forms.EmailField()
def do_save(self):
    new_u = User(username=str(time()),email= self.cleaned_data.get('email'),)
    new_u.save()
    new_p = Profile.objects.create_profile(new_u)
    new_p.save()
    return new_p

мой взгляд:

def registerCustom(request, backend, success_url=None, form_class=None,
         disallowed_url='registration_disallowed',
         template_name='registration/registration_form.html',
         extra_context=None,
     initial={}):

form = RegistrationFormCustom(initial=initial)
if request.method == 'POST':
    form = RegistrationFormCustom(initial=initial, data=request.POST)
    if form.is_valid():
        profile = form.do_save()
        profile = auth.authenticate(username = profile.user.email, password = form.cleaned_data.get('pass1'))
        print(profile)
        auth.login(request, profile)
        return redirect('/')

    else:
        pass

return render_jinja(request, 'registration/registration_form.html',
        type="register",
        form = form
        )

и я буду опубликовать любой другой, который с радостью отключится

Это было полезно?

Решение

Вы получаете 'RegistrationProfile' object has no attribute 'backend' Ошибка, потому что пользователь еще не аутентифицирован. Чтобы войти в кого -то, вы должны позвонить authenticate Сначала метод, который требует пароля. Итак, вместо этого вы можете сделать:

from django.contrib.auth import load_backend, login, logout
from django.conf import settings

def _login_user(request, user):
    """
    Log in a user without requiring credentials (using ``login`` from
    ``django.contrib.auth``, first finding a matching backend).

    """
    if not hasattr(user, 'backend'):
        for backend in settings.AUTHENTICATION_BACKENDS:
            if user == load_backend(backend).get_user(user.pk):
                user.backend = backend
                break
    if hasattr(user, 'backend'):
        return login(request, user)

Затем, чтобы войти в кого -то, просто позвоните _login_user функционировать с запросом и User модель. (Это будет profile.user В вашем случае, вероятно) делайте это вместо того, чтобы звонить auth.login. Анкет Я не уверен, как вы собираетесь определить, является ли это действительным пользователем или нет, без пароля или имени пользователя, но я оставлю это вам. Если у вас все еще есть проблемы, дайте мне знать.

Краткое объяснение:

Что в основном происходит здесь, так это то, что Джанго требует, чтобы пользователь был аутентифицирован, чтобы войти в систему через login функция Эта аутентификация обычно выполняется authenticate Функция, которая требует имени пользователя и пароля, и проверяет, соответствует ли предоставленный пароль хешированную версию в базе данных. Если это так, он добавляет бэкэнд аутентификации в User модель.

Итак, поскольку у вас нет пароля и имени пользователя, вам просто нужно написать свой собственный метод для добавления бэкэнда аутентификации в User модель. И это то, что мой _login_user) функция выполняет - если пользователь уже аутентифицирован, он просто вызывает login, в противном случае, сначала добавляет бэкэнд по умолчанию к User модель, не проверяя правильное имя пользователя и пароль (например authenticate делает).

Другие советы

Для других, читающих этот поток, я получил аналогичное сообщение об ошибке, когда использовал user.objects.create () вместо user.objects.create_user (). По сути, первым методом был настройка четкого пароля, тогда как Create_user шифрует пароль. Очистить пароли не смогут аутентифицировать. Проверьте свою базу данных, если у вас есть пароли, установленные в Clear, то, вероятно, вам нужно использовать create_user ().

Запрос автора может быть исправлен, просто установив пользователя и пароля по умолчанию с помощью create_user () вместо просто user.save ().

Вы можете создать известный пароль (поместите его в настройки.py) и использовать его, как если бы пользователь ввел его. Создайте пользователя с этим и аутентифицируйте пользователя с этим.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top