Этот пост , посвященный этой проблеме, чрезвычайно полезен. Для удобства скопирую сюда:
Вы не касаетесь внешнего кода приложения
Вы не должны редактировать код из внешнего приложения. Если вы сначала не раскошелитесь на github.
Итак, как переопределить без разветвления:
Переопределение шаблона
Если вы хотите переопределить templates/userena/activate_fail.html
, то все, что вам нужно сделать, это создать свой собственный каталог templates/userena
и внести в него свой собственный activate_fail.html
.
Переопределение URL
Вероятно, первое, что вы должны проверить во внешнем приложении, это его urls.py. Правильно закодированные представления должны поддерживать множество аргументов. Например, userena имеет вид регистрации с такой подписью (на момент написания):
def signup(request, signup_form=SignupForm,
template_name='userena/signup_form.html', success_url=None,
extra_context=None):
Это означает, что вы можете заменить форму, используемую представлением регистрации. Для этого откройте ваш urls.py, добавьте то, что нам нужно, вверху:
from userena import views as userena_views
from yourforms import YourSignupForm
Затем найдите включаемые URL внешнего приложения, например:
url(r'^userena/', include('userena.urls')),
Перед этим добавьте переопределение вашего URL:
url(r'^userena/signup/$', userena_views.signup, {'signup_form': YourSignupForm}, name='userena_signup'),
url(r'^userena/', include('userena.urls')),
Теперь ваше пользовательское определение URL будет первым, когда посетитель нажмет /userena/signup/
. Это означает, что /userena/signup/
будет использовать YourSignupForm вместо формы регистрации userena.
Этот трюк работает с любым аргументом представления. Те, которые вы должны увидеть чаще всего:
template_name
: позволяет изменить имя шаблона
extra_context
: позволяет добавить диктовку, которая будет добавлена к
Контекст
Почти каждое представление должно иметь эти аргументы.
Переопределение вида
Переопределение представления требует переопределения URL представления, которое вы хотите заменить. Если вы хотите, чтобы использовалось ваше собственное представление регистрации, просто переопределите URL:
import yourviews
# ...
url(r'^userena/signup/$', yourviews.yoursignup, name='userena_signup'),
url(r'^userena/', include('userena.urls')),
Украшение вида
Декорирование представления аналогично переопределению представления, но использует представление внешнего приложения. По сути, это то же самое, что и переопределение представления (см. Выше), но ваше представление будет выглядеть следующим образом
from userena import views as userena_views
def yoursignup(request):
# do stuff before userena signup view is called
# call the original view
response = userena_views.signup(request)
# do stuff after userena signup view is done
# return the response
return response
Форкирование приложения
Если вы сначала не знакомы с pip и virtualenv, прочтите сначала статью об использовании pip и virtualenv.
Например:
- Вы установили django-userena следующим образом: pip install django-userena
- Сначала вы должны удалить его: pip uninstall django-userena
- Затем перейдите на страницу приложения github
- Нажмите на кнопку вилки
- Это сделает вас хранилищем с копией django-userena
- Установите его так: pip install -e
git+git@github.com: ваше-имя пользователя / Джанго-userena.git # яйцо = Джанго-userena
- Затем вы можете редактировать код в yourenv / src / django-userena
- Нажмите ваши коммиты
Кредиты автору сообщения!