Django allauth, multiple form signup -


i'm trying create multi form signup django allauth. (i tried django wizard, opted out of sign isn't linear path, depending on earlier form data filled out user). what's best way django allauth work multi page signup?

i thought using series of form views first creating user , login them in:

@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}) 

followed series of similar views require login , ending view uses complete_signup method 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}) 

and overridding url used login django-allauth point first signup view. i'm not sure if best approach?

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

so basic idea given here. in case, need 1 field checked, since it's acceptance of terms , conditions. it's annoying deal custom user model @ stage of project, made requirement , saved in profile [1].

the profile model (and important profile models work pleasantly) has fields null=true or default. allows programmatically create them minimal or no available information.

class baseprofile(models.model):     user = models.onetoonefield(         settings.auth_user_model, related_name='profile',     )     accepted_terms = models.booleanfield(         default=false, verbose_name=_('terms accepted'),     ) 

then need form info. ignore account_type bits, it's because have different account types, different profile models tacking onto base profile:

from allauth.utils import get_request_param django import forms django.core.exceptions import validationerror django.utils.translation import ugettext_lazy _  kernel.models import create_profile_for_user  class requiretruefield(forms.booleanfield):     default_error_messages = {         'require_true': _('this field must 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 terms , conditions')         }, label=_('i agree terms , 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: should generate created true. verify?         except typeerror:             # xxx: spam             pass 

in template, put hidden field "next":

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

which allauth use success_url. note if it's not set, user created, form not redirect.

so have user profile model, minimal data , can ask next batch of questions. each stage, implement booleanfield on profile model. guard views require active account booleans ticked, using userpassestestmixin.

[1] idea of saving in first place, because if terms , conditions change, can change value of field , deny login till it's ticked again.


Comments

Popular posts from this blog

resizing Telegram inline keyboard -

command line - How can a Python program background itself? -

php - "cURL error 28: Resolving timed out" on Wordpress on Azure App Service on Linux -