Проблемы с совмещением django-регистрации и FormWizard - PullRequest
2 голосов
/ 21 июня 2011

Я делаю что-то не так, но я не знаю что.Я пытаюсь объединить django-registration 0.7 и мастер форм, но получаю ошибку, подобную этой:

AttributeError at /
    'BoundField' object has no attribute 'strip
/home/celtrun/rails/neuroweb/site-packages/django/core/handlers/base.py in get_response
                        response = callback(request, *callback_args, **callback_kwargs) ...
▶ Local vars
/home/celtrun/rails/neuroweb/site-packages/django/utils/decorators.py in _wrapper
            return bound_func(*args, **kwargs) ...
▶ Local vars
/home/celtrun/rails/neuroweb/site-packages/django/utils/decorators.py in _wrapped_view
                    response = view_func(request, *args, **kwargs) ...
▶ Local vars
/home/celtrun/rails/neuroweb/site-packages/django/utils/decorators.py in bound_func
                return func(self, *args2, **kwargs2) ...
▶ Local vars
/home/celtrun/rails/neuroweb/site-packages/django/contrib/formtools/wizard.py in __call__
                return self.done(request, previous_form_list + [form]) ...
▶ Local vars
/home/celtrun/rails/neuroweb/apps/registration/views.py in done
              extra_context=None, formed=form_list[0]) ...
▶ Local vars
/home/celtrun/rails/neuroweb/apps/registration/views.py in register
                             send_email=True, profile_callback=None) ...
▶ Local vars
/home/celtrun/rails/neuroweb/apps/registration/models.py in create_inactive_user
        new_user = User.objects.create_user(username, email, password) ...
▶ Local vars
/home/celtrun/rails/neuroweb/site-packages/django/contrib/auth/models.py in create_user
            email_name, domain_part = email.strip().split('@', 1) '

В качестве моего FormWizard у меня есть (r'^$', RegistrationWizard([RegistrationForm, CaptchaForm])),:

class RegistrationWizard(FormWizard,):
    def done(self, request, form_list):
        formed = form_list[0]
        register(request, success_url=None,
             form_class=RegistrationForm, profile_callback=None,
             template_name='base.html',
              extra_context=None, formed=form_list[0])
        return redirect('/accounts/register/complete/')
    def get_template(self, steps):
        return ['base.html', 'base.html']

class CaptchaForm(forms.Form):
    recaptcha = ReCaptchaField()       

Функция регистрации:

def register(request, success_url=None,
             form_class=RegistrationForm, profile_callback=None,
             template_name='registration/registration_form.html',
             extra_context=None, formed=None):
    if request.method == 'POST':
        if formed: form = formed
        if form.is_valid():
            username = formed['username'] 
            email = formed['email']
            password = formed['password1'] 
            RegistrationProfile.objects.create_inactive_user(username, password, email,
                             send_email=True, profile_callback=None)           
            return HttpResponseRedirect(success_url or reverse('registration_complete'))
    else:
        form = form_class()

    if extra_context is None:
        extra_context = {}
    context = RequestContext(request)
    for key, value in extra_context.items():
        context[key] = callable(value) and value() or value
    return render_to_response(template_name,
                              { 'form': form },
                              context_instance=context)

И функция create_inactive_user для RegistrationProfile:

   def create_inactive_user(self, username, password, email,
                             send_email=True, profile_callback=None):
        new_user = User.objects.create_user(username, email, password)
        new_user.is_active = False
        new_user.save()

        registration_profile = self.create_profile(new_user)

        if profile_callback is not None:
            profile_callback(user=new_user)

        if send_email:
            from django.core.mail import send_mail
            current_site = Site.objects.get_current()

            subject = render_to_string('registration/activation_email_subject.txt',
                                       { 'site': current_site })
            # Email subject *must not* contain newlines
            subject = ''.join(subject.splitlines())

            message = render_to_string('registration/activation_email.txt',
                                       { 'activation_key': registration_profile.activation_key,
                                         'expiration_days': settings.ACCOUNT_ACTIVATION_DAYS,
                                         'site': current_site })

            send_mail(subject, message, settings.DEFAULT_FROM_EMAIL, [new_user.email])
        return new_user

Надеюсь, я не пропустил ничего важного, чтобы показать.Кто-то знает, что такая ошибка может означать или помочь другим способом?

Ответы [ 2 ]

3 голосов
/ 21 июня 2011

В вашей register функции у вас есть:

email = formed['email']

email будет указывать на поле электронной почты , а не на его значение. Чтобы получить значения ваших полей, всегда используйте словарь cleaned_data вида .

(То же самое для username и password)

Ваш код должен быть (в register):

...
if request.method == 'POST':
   if formed: form = formed
   if form.is_valid():
      username = form.cleaned_data['username'] 
      email = form.cleaned_data['email']
      password = form.cleaned_data['password1'] 
      RegistrationProfile.objects.create_inactive_user(username, password, email,
                         send_email=True, profile_callback=None)
...
0 голосов
/ 21 июня 2011

Мой инстинкт коленного толчка заключается в том, что вы забыли добавить строку промежуточного программного обеспечения в файл настроек ... Но я, честно говоря, на самом деле не знаю - просто ~ инстинкт.

...