2011-06-20 15 views
6

Django-Registration ma kilka klas formularzy w pliku forms.py. Jednym z nich jest „klasa RegistrationFormTermsOfService (RegistrationForm) ..Jak korzystać z różnych formularzy w Django-Registration

Co mogę zmienić w pozostałej części Django kod rejestracyjny, aby włączyć tę formę w mojej rejestracji przepływu zamiast RegistrationForm?

Odpowiedz

5

można po prostu pójść do swojego urls.py i zastąpić klasę formularz wykonując coś takiego:

from registration.forms import RegistrationFormTermsOfService 

(r'^accounts/register/$', 'registration.views.register', {'form_class' : RegistrationFormTermsOfService}), 
+0

, które brzmią niesamowicie prosto ... a nowy formularz powinien pojawić się podczas przeładowywania formularza reg? – Brenden

+0

Dlaczego nie spróbujesz :-) (Podpowiedź: tak, powinna) –

+0

Więc umieszczam to w moim głównym urls.py i przed linią rejestracyjną. Ale otrzymuję rejestr błędów() pobiera co najmniej 2 argumenty inne niż kluczowe (1 podany) – Brenden

1

Musisz napisać nową rejestrację Utwórz gdzieś w swoim projekcie.Możesz dziedziczyć istniejący formularz uwierzytelniania, jeśli tylko rozwijasz nowe pola, a następnie chcesz napisać nowy backend, aby przetworzyć formularz .Następnie musisz napisać swój własny adres URL i auth_urls i przedefiniować adresy URL, aby zamienić formularz backendu i uwierzytelniania w widokach, zmieniając zmienne przekazywane do widoku. k otwórz źródło, aby zobaczyć, jak działają. Opieram swoją strukturę na oryginalnym kodzie rejestracyjnym django, aby zachować spójność.

+0

Ten formularz już istnieje w pliku forms.py. Czy nadal muszę napisać nowy formularz rejestracyjny? Dosłownie chcę użyć drugiej klasy (wymienionej w pytaniu) zamiast standardowej klasy Reg. Po prostu nie wiem, jak ustawić tę formę jako aktywną. – Brenden

5

Oto praktyczny przykład użycia niestandardowego formularza i zaplecza, który ustawia nazwę użytkownika == adres e-mail, i tylko monituje użytkownika o adres e-mail przy rejestracji. W, na przykład do my_registration.py:

from django.conf import settings 
from django.contrib.sites.models import RequestSite 
from django.contrib.sites.models import Site 

from registration import signals 
from registration.forms import RegistrationForm 
from registration.models import RegistrationProfile 
from registration.backends.default import DefaultBackend 

class EmailRegistrationForm(RegistrationForm): 
    def __init__(self, *args, **kwargs): 
     super(EmailRegistrationForm,self).__init__(*args, **kwargs) 
     del self.fields['username'] 

    def clean(self): 
     cleaned_data = super(EmailRegistrationForm,self).clean() 
     if 'email' in self.cleaned_data: 
      cleaned_data['username'] = self.cleaned_data['username'] = self.cleaned_data['email'] 
     return cleaned_data 


class EmailBackend(DefaultBackend): 
    def get_form_class(self, request): 
     return EmailRegistrationForm 

W my_registration_urls.py:

from django.conf.urls.defaults import * 
from django.views.generic.simple import direct_to_template 

from registration.views import activate 
from registration.views import register 

urlpatterns = patterns('', 
        url(r'^activate/complete/$', 
         direct_to_template, 
         { 'template': 'registration/activation_complete.html' }, 
         name='registration_activation_complete'), 
        # Activation keys get matched by \w+ instead of the more specific 
        # [a-fA-F0-9]{40} because a bad activation key should still get to the view; 
        # that way it can return a sensible "invalid key" message instead of a 
        # confusing 404. 
        url(r'^activate/(?P<activation_key>\w+)/$', 
         activate, 
         { 'backend': 'my_registration.EmailBackend' }, 
         name='registration_activate'), 
        url(r'^register/$', 
         register, 
         { 'backend': 'my_registration.EmailBackend' }, 
         name='registration_register'), 
        url(r'^register/complete/$', 
         direct_to_template, 
         { 'template': 'registration/registration_complete.html' }, 
         name='registration_complete'), 
        url(r'^register/closed/$', 
         direct_to_template, 
         { 'template': 'registration/registration_closed.html' }, 
         name='registration_disallowed'), 
        (r'', include('registration.auth_urls')), 
        ) 

Następnie w rdzeniu urls.py, upewnić się, obejmują:

url(r'^accounts/', include('my_registration_urls')), 
+0

Zwróć uwagę na ustawienia "zaplecza" w my_registration_urls.py ... – Darb

13

Aktualizacja zaakceptowane odpowiedzi zgodne z Django 1.5 oraz najnowszej wersji Django rejestracji:

w urls.py:

from registration.forms import RegistrationFormTermsOfService 
from registration.backends.default.views import RegistrationView 

urlpatterns = patterns('', 
    url(r'^accounts/register/$', RegistrationView.as_view(form_class=RegistrationFormTermsOfService), name='registration_register'), 
    # your other URLconf stuff follows ... 
) 

następnie zaktualizować szablon registration_form.html i dodać pole tos , np .:

<p> 
<label for="id_tos">I accept the terms of service</label> 
{% if form.tos.errors %} 
    <p class="errors">{{ form.tos.errors.as_text }}</p> 
{% endif %} 
{{ form.tos }} 
</p> 
+0

if chcesz użyć "prostego" przepływu pracy, który nie wymaga aktywacji e-mail i użytkownik jest aktywowany natychmiast, zaimportuj ten widok zamiast "from.registration.backends.simple.views import RegistrationView". – static

Powiązane problemy