0

사용자 이름 대신 전자 메일로 사용자를 인증하려고합니다.전자 메일 및 결과 라우팅 문제를 사용한 인증

나는 django-userena을 사용하고 있으며 문서 등을 사용하고 있습니다. 나는 필요한 거의 모든 것을 설정했다. 같은 모양 : USERENA_WITHOUT_USERNAMES = True 설정에

그러나 가입 후, 나는 일련의 문제에 직면했습니다.

사용자 이름을 인수로 사용하는 일부보기 기능을 변경했지만이 방법으로도 내 문제가 해결되지 않았으며 정확하지 않을 수 있습니다.) 그것을 할 방법. 예를 들어

($ ./manage.py check_permissions 후)이 URL http://127.0.0.1:8000/accounts/signup/complete/로 라우팅하여이 오류를 얻을 : 내가 부족 아무것도

global name 'username' is not defined 
/userena/views.py in directto_user_template 
user = get_object_or_404(User, username_iexact=username) 

있습니까?

는 UPDATE :

userena/templates/userena/emails/activation_email_message.txt, error at line 8

1 {% load i18n %}{% autoescape off %} 
2 {% if not without_usernames %}{% blocktrans with user.username as username %}Dear {{ username }},{% endblocktrans %} 
3 {% endif %} 
4 {% blocktrans with site.name as site %}Thank you for signing up at {{ site }}.{% endblocktrans %} 
5 
6 {% trans "To activate your account you should click on the link below:" %} 
7 
8 {{ protocol }}://{{ site.domain }}{% url userena_activate user.username activation_key %} 
9 
10 {% trans "Thanks for using our site!" %} 
11 
12 {% trans "Sincerely" %}, 
13 {{ site.name }} 
14 {% endautoescape %} 

업데이트 2 :

Caught NoReverseMatch while rendering: Reverse for 'userena_activate' with arguments '('[email protected]', '70b60d1d97015e03ba8d57f31e4c7ff14d6ab753')' and keyword arguments '{}' not found.

그것은 userena가 URL과 사용자 이름으로 이메일을 시도하는 분명하다 : 여기 내가 얻을 그 출력 : 괜찮습니다. SignupFormOnlyEmail 클래스 형식의 소스 코드를 보면 임의의 사용자 이름이 자동으로 생성된다고합니다.

class SignupFormOnlyEmail(SignupForm): 
    """ 
    Form for creating a new user account but not needing a username. 

    This form is an adaptation of :class:`SignupForm`. It's used when 
    ``USERENA_WITHOUT_USERNAME`` setting is set to ``True``. And thus the user 
    is not asked to supply an username, but one is generated for them. The user 
    can than keep sign in by using their email. 

    """ 
    def __init__(self, *args, **kwargs): 
     super(SignupFormOnlyEmail, self).__init__(*args, **kwargs) 
     del self.fields['username'] 

    def save(self): 
     """ Generate a random username before falling back to parent signup form """ 
     while True: 
      username = sha_constructor(str(random.random())).hexdigest()[:5] 
      try: 
       User.objects.get(username__iexact=username) 
      except User.DoesNotExist: break 

     self.cleaned_data['username'] = username 
     return super(SignupFormOnlyEmail, self).save() 

업데이트 :

나는 마지막으로 문제를 해결했다. 나는 django-userena 옆에도 django-email-as-username을 사용하고있었습니다. 이것이 내 문제의 원인이었습니다. 분명히, 그들은 약간의 갈등을 가지고 있습니다. 당신은 키워드 인수 (usernameactivation_key)와 URL 경로 userena_activate을 정의한

+1

오류 메시지에 모든 것 : 변수 'username'이 정의되지 않았습니다. 귀하의 의견, posts.py, pls 코드 – yedpodtrzitko

+0

코드는 [Github] (http://github.com/bread-and-pepper/django-userena/blob/master/userena/views.py)에 있습니다. 나는 더 많은 정보와 함께 게시물을 업데이 트됩니다 .. 예를 들어, 라인 142 봐, "활성화"기능 .. – Soask

답변

2

조심해,하지만 당신은 단지 인수를 호출, 변경 템플릿 인수를 키워드하기 : 인해

{% url userena_activate username=user.username activation_key=activation_key %} 

편집 코멘트 :

난 당신의 문제를 corectly 이해하는지 모르겠지만, 거기에 문제가 있다고 생각합니다. 너의 오류 메시지가 :

Caught NoReverseMatch while rendering: Reverse for 'userena_activate' with arguments '('[email protected]', '70b60d1d97015e03ba8d57f31e4c7ff14d6ab753')' and keyword arguments '{}' not found. 

유효한 인수를 전달한 것처럼 보이지만 잘못 전달한 것 같습니다. urls.py의 URL 경로는 kwargs을 예상하는 방식으로 정의되어 있지만 args 만 전달하면 정의가 일치하지 않습니다. 그래서이 오류 메시지가 나타납니다. 단순 전달 인수는 kwargs입니다 (즉, 각 인수는 위에 표시된 것처럼 이름과 값을 전달합니다).

urls.인수와 키워드 인수 사이의 평 차이 : 사용자 이름 (효과적으로)로 이메일 주소를 사용하는

url(r'^(?P<username>[\.\w]+)/activate/(?P<activation_key>\w+)/$', userena_views.activate, name='userena_activate'), 
     ^this is _keyword argument_ 'username', expects value with argument value AND name 

url(r'^page/(.*)/$', userena_views.ProfileListView.as_view(), name='userena_profile_list_paginated'), 
      ^this is argument, expects only value, not argument name 
+0

당신 말이 맞아 .. 나는 문제의 사슬을 말한 이유는 사용자 이름이 없어 ... 만약 편집 및 사용자 이름 /보기/URL/템플릿, 등 제거, 다음보기 및 urls뿐만 아니라 ... 내 붙어있어 코드베이스 내에서 사용자 이름 필드의 "모든"제거하는 것이 좋습니다 ?? 아니면 더 깔끔하고 깨끗한 방법이 있습니까? – Soask

+1

추가 : 사용자 이름이 있습니다 (최소한 사용자가 선언 했음). 템플릿 출력 ({{user.username}})에 추가하면 그 사실을 볼 수 있으므로 실제 문제는 아닌 것을 알 수 있습니다. – yedpodtrzitko

+0

예, 무작위로 제작되었습니다. 좋습니다, 당신은 제안합니다. 간단한 인수를 kwargs_로 사용하십시오. 네, 맞습니다. 그러나 'userena_activate'에 대한 관련 URL은 "kwargs"를 허용합니다. 왜 그렇게 불평합니까? 너무 많은 질문을해서 죄송합니다. 이것은 나를 위해 매우 중요합니다. – Soask

0

정말 간단한 대안은 django-easy-userena - 이것은 Userena의 상위 호환 포크입니다

  • 사용하는 이메일 주소로 유효 사용자 ID -에 숨겨져있는 임의의 숫자 이름을 생성합니다 몇 가지 멋진 기능을 추가 양식 및 확인 이메일은
  • 적은 의존성 -이 좋은 결과를 했어

장고 - 보호자 또는 서비스 계약 필드의

  • 용어가 내장되어 쉽게 썸네일, 체크 박스 등의 디스플레이를 필요로하지 않습니다 - 어떤 이유로 든 설치가 수동 이었지만 (userena dir을 사이트 패키지로 복사) 혼란없이 일했습니다.

    나는 전체 Userena 접근법을 좋아하지만, 필자에게 필요한 것은 easy-userena가 더 적합합니다.

  • 관련 문제