2017-09-10 2 views
0

나는 django allauth로 다중 양식 가입을 만들려고합니다. (원래 장고 마법사를 시도했지만, 사용자가 작성한 이전 양식 데이터에 따라 서명이 반드시 선형 경로가 아니므로 선택하지 마십시오). django allauth를 멀티 페이지 가입과 함께 사용하는 가장 좋은 방법은 무엇입니까? 를 사용하는 도면과 함께 종료 후, 로그인 요구 유사한 뷰 시리즈 다음장고 allauth, 복수 양식 가입

@require_http_methods(['GET', 'HEAD', 'POST']) 
def profile_view(request, price_id): 
    form = ProfileForm() 
    if request.method == 'POST': 
     form = ProfileForm(request.POST) 
     if form.is_valid(): 
      form.save() 
      user = authenticate(request, username=form.cleaned_data['email'], 
           password=form.cleaned_data['password1']) 
      login(request, user) 
      return redirect('users:supply_address') 
    return render(request, 'pages/signup.html', {'form': form}) 

:

는 I는 사용자를 생성 제와 형태 뷰 시리즈를 사용하여 그들을 로그인 생각 complete_signup django-allauth의 방법.

@login_required 
@require_http_methods(['GET', 'HEAD', 'POST']) 
def direct_debit_view(request): 
    form = DirectDebitForm() 
    if request.method == 'POST': 
     form = DirectDebitForm(data=request.POST) 
     if form.is_valid(): 
      request.session.update(form.cleaned_data) 
      complete_signup(request, user, settings.ACCOUNT_EMAIL_VERIFICATION,settings.LOGIN_REDIRECT_URL) 
      return redirect(settings.LOGIN_REDIRECT_URL) 
    return render(request, 'pages/signup_postcode.html', {'form': form}) 

그리고 첫 번째 가입보기를 가리 키도록 django-allauth의 로그인에 사용 된 url을 무시합니다. 그러나 이것이 최선의 접근 방법인지 확실하지 않습니다.

url(r'^account/signup/$', views.profile_view, name='profile'), 
+0

다른 접근 방법이 필요합니다. 첫 번째 양식은 이미 로그인 할 수있는 유효한 사용자를 생성합니다. 따라서 가입은 모든 의도와 목적을 위해 수행됩니다. 나머지는 프로필을 완료하고 있습니다. 이것은 정상이며 대부분의 가입이 작동하는 방법이지만, 모든 것이 완료되기 전에 사용자 계정을 만들지 않으려면 세션을 사용해야합니다. 최종 형식은 필드의 통합이 필요하며 세션의 내용으로 부분적으로 채워 져야합니다. – Melvyn

+0

세션 경로를 시작했지만 json 인코딩에서 지원되지 않는 유형의 경우 더 어려워졌습니다. 나는 먼저 사용자 계정을 생성하고 나서 나중에 더 많은 데이터를 추가하는 것이 좋습니다 (완벽한 상황은 아니지만). 가입 프로세스가 모두 끝나기 전에 이메일을 보내지 않으려합니다. 끝마친.사용자가 가입을 완료하지 않고 데이터를 완료하지 않으면 불완전한 세부 정보가있는 사용자 계정을 볼 수 있습니다. – Yunti

+0

나는 완전히 다른 프로필 모델을 가진 두 가지 사용자 유형이 있다는 것을 제외하고는 거의 같은 보트에 있습니다. 나는 "다음"을 사용하여 길을 본다. request.POST 또는 request.GET에서 다음에 제공하면 리디렉션 URL을 무시할 수 있습니다. 양식 필드로 전달하는 것은 내가 지금하고있는 길입니다. 아무도 들어 오지 않으면 모든 코드가 작동 할 때 코드를 게시 할 것입니다. – Melvyn

답변

0

따라서 기본 아이디어는 given here입니다. 내 경우에는 조건을 수락하기 때문에 항상 한 필드를 확인해야합니다. 프로젝트의이 단계에서 사용자 정의 사용자 모델을 처리하는 것은 너무 짜증나, 그래서 나는 프로파일을 요구하고 저장했습니다. [1].

프로필 모델 (모든 프로필 모델이 즐겁게 작동하는 데 중요 함)에는 null=True 또는 기본값이있는 모든 필드가 있습니다. 이를 통해 최소한의 정보 만 사용하거나 프로그래밍 할 수없는 정보를 프로그래밍 방식으로 생성 할 수 있습니다.

class BaseProfile(models.Model): 
    user = models.OneToOneField(
     settings.AUTH_USER_MODEL, related_name='profile', 
    ) 
    accepted_terms = models.BooleanField(
     default=False, verbose_name=_('terms accepted'), 
    ) 

그런 다음 추가 정보 양식이 필요합니다. 우리가 다른 계정 유형이 있기 때문에 다른 프로파일 모델은 기본 프로필에 시침과,의는 ACCOUNT_TYPE 비트를 무시 : 템플릿에서

from allauth.utils import get_request_param 
from django import forms 
from django.core.exceptions import ValidationError 
from django.utils.translation import ugettext_lazy as _ 

from kernel.models import create_profile_for_user 

class RequireTrueField(forms.BooleanField): 
    default_error_messages = { 
     'require_true': _('This field must be true') 
    } 
    widget = forms.CheckboxInput 

    def validate(self, value): 
     if not value: 
      raise ValidationError(self.error_messages['require_true'], 
            code='require_true') 

class AccountSignupForm(forms.Form): 
    error_css_class = 'has-error' 
    accept_terms = RequireTrueField(
     initial=False, error_messages={ 
      'require_true': _('You must accept the terms and conditions') 
     }, label=_('I agree to the terms and conditions') 
    ) 

    def signup(self, request, user): 
     account_type = get_request_param(request, 'account_type', '') 
     accepted = self.cleaned_data['accept_terms'] 
     try: 
      profile, created = create_profile_for_user(
       user, account_type, accepted_terms=accepted, 
      ) 
      # XXX: This should always generate created as True. Verify? 
     except TypeError: 
      # XXX: spam someone 
      pass 

, 우리는 "다음"에 숨겨진 필드를 넣어 :

<input type="hidden" name="next" value="{% url 'kernel:profile_signup' %}"/> 

allauth는 success_url으로 사용할 것입니다. 이 아닌 경우으로 설정하면 사용자가 생성되지만 양식은 리디렉션되지 않습니다.

이제 프로필 모델과 최소한의 데이터가있는 사용자가 있으며 다음 번 질문을 할 수 있습니다. 각 단계마다 프로파일 모델에 BooleanField를 구현하십시오. UserPassesTestMixin을 사용하는 모든 부울이 표시된 활성 계정이 필요한 가드 뷰.

[1] 조건을 변경하면 필드의 값을 변경하고 다시 로그인 할 때까지 로그인을 거부 할 수 있기 때문에 우선 저장하는 것이 좋습니다.