2011-08-31 4 views
2

Мне нужно сделать очень простую модификацию - потребовать, чтобы определенные представления появлялись только тогда, когда пользователь не прошел аутентификацию - в представлениях по умолчанию django-registration. Например, если я вошел в систему, я не хочу, чтобы пользователи снова могли посетить страницу/register.Индивидуальные представления с django-registration

Итак, я думаю, что идея состоит в том, что я хочу подклассировать вид register из django-registration. Это именно то, где я не уверен, как действовать дальше. Правильно ли это? Должен ли я проверить статус аутентификации пользователя здесь? Советы и рекомендации приветствуются!

Редактировать

Я думаю, что это правильный путь здесь: Django: Redirect logged in users from login page

Edit 2

Решение:

Создайте другое приложение, например, custom_registration, и писать вид, подобный этому (шахта также использует пользовательскую форму):

from registration.views import register 
from custom_registration.forms import EduRegistrationForm 

def register_test(request, success_url=None, 
      form_class=EduRegistrationForm, profile_callback=None, 
      template_name='registration/registration_form.html', 
      extra_context=None): 
    if request.user.is_authenticated(): 
     return HttpResponseRedirect('/') 
    else: 
     return register(request, success_url, form_class, profile_callback, template_name, extra_context) 

Мне пришлось использовать те же параметры функции, но в остальном просто включить тест, и если мы передадим его, перейдите к основной функции.

Не забудьте поставить это в URLconf либо (опять-таки, это включает в себя некоторые вещи о моей пользовательской форме, а):

верхнего уровня URLconf

(r'^accounts/', include('custom_registration.urls')), 
(r'^accounts/', include('registration.urls')), 

custom_registration.views

from django.conf.urls.defaults import * 
from custom_registration.views import register_test 
from custom_registration.forms import EduRegistrationForm 

urlpatterns = patterns('', 
    url(r'^register/$', register_test, {'form_class': EduRegistrationForm}, name='registration.views.register'), 
) 

ответ

5

Насколько я помню, django-registration использует функциональные представления, поэтому вы не можете их подклассифицировать. Подход, который я обычно соблюдаю, - это «переписывание» исходных представлений (без внесения изменений в приложение для регистрации django). Это работает так:

  1. Создать другое приложение (вы могли бы назвать это custom_registration или что вы хотите)
  2. Это приложение должны содержать другой urls.py и в вашем случае еще views.py
  3. Скопируйте оригинальный register вид кода чтобы ваш новый views.py и изменить его, добавить шаблон к вашему urls.py, чтобы указать на этой точке зрения (используйте один и тот же шаблон URL-адрес, как и в Джанго регистрации этой точки зрения)
  4. Поместите include в проекты urls.py из вашего новое приложение urls.pyдо, в том числе оригинальное приложение для регистрации django. Это может выглядеть следующим образом, например:
urlpatterns = patterns('', 
    ... 
    url(r'^accounts/', include('custom_registration.urls')), 
    url(r'^accounts/', include('registration.backends.default.urls')), 
    ... 
) 

Это просто работает, так как первый шаблон согласования URL для /accounts/register будет указывать на ваше новое приложение, поэтому он никогда не будет пытаться вызвать один из оригинальное приложение.

+0

Я сделал большинство из этого уже в моем правлении выше, но я дам его вам. Проверьте эту ссылку, и вы можете увидеть, как он обертывает функцию вокруг другой функции, и если вы пройдете тест, вы перейдете к реальной функции. Мне пришлось использовать те же параметры в моей тестовой функции, что и в 'register', но в остальном это отлично работает. Не нужно дублировать свой код за его пределами. Посмотрите мое второе изменение для кода. –

+0

Да, конечно, вы также можете вызвать исходный вид в своем представлении и вернуть его ответ. На самом деле я делаю то же самое все время. Чтобы это было просто, хотя я не упоминаю об этом здесь. –

+1

С последним и самым лучшим, этот ответ теперь устарел! Теперь представления могут быть подклассифицированы. см. [Django docs] (https://docs.djangoproject.com/en/1.5/topics/class-based-views/intro/) и [django-registration docs] (https: //django-registration.readthedocs .org/ru/последние/views.html) –

Смежные вопросы