Django: изменение/расширение сторонних приложений
вопрос о новичке django
Я хочу использовать стороннее приложение, но мне нужно сделать несколько модов (в этом случае приложение является django-registration, и мне нужно изменить такие вещи, как разрешение регистрации без подтверждения по электронной почте)
Изначально я просто установил приложение в папку общих пакетов сайтов и изменил там код. Теперь, когда я помещаю свой код в битбакет, мне нужен способ сохранить мои моды в репозитории в удобном виде, а загрузка полного кода на Python не похожа на хорошую идею.
Я думаю, лучший способ - сохранить стороннее приложение в пакетах сайтов и создать приложение в моем проекте, чтобы сохранить мои изменения. В моем случае я бы создал my-django-registration в моем проекте, а затем импортировал это, когда мне это нужно в моем коде, а не в django-registration.
Я также читал о virtualenv, но я думаю, что в основном используется для возможности использования нескольких сред на одном компьютере (фактически, где-то он советует не изменять модули, установленные в virtualenv), и не помогает мне с сохраняя мои изменения в репозитории.
Любые комментарии приветствуются!
Благодаря
Ответы
Ответ 1
Я думаю, что самым простым способом добиться того, что вы ищете, будет fork django-registration, а в вашем приложении вместо вилки вместо оригинального проекта.
При этом вы можете иметь регистрацию без регистрации в django-регистрации без изменения кода приложения. Я сделал это, создав пользовательский бэкэнд регистрации, который устанавливает пользователей как активированные при создании. Здесь вы можете увидеть другие способы сделать то же самое.
Ответ 2
В общем, вы должны повторно использовать и переопределять поведение в сторонних приложениях, а не изменять их источники.
То, что вы чаще всего встретите, это то, что приложения поставляют модели, которые могут не обязательно покрывать ваши потребности, но выполняют большую часть работы; у вас будут формы, которые почти идеальны, но нужно что-то мало; у вас будут представления, которые были бы идеальными, если бы вы могли просто изменить одну вещь; у вас будут URL-адреса, которые являются нормальными, но вам нужно что-то еще от них.
В большинстве случаев вам просто потребуется создать пользовательское приложение и перепроверить все. Отправляйте свои собственные URL-адреса, которые сопоставляются с расширенными представлениями и отменяет методы для пользовательского поведения; поставьте его в виде модели, который Meta
использует новую модель, которую вы расширили с оригинала; так далее...
Это всего лишь верхушка айсберга того, что вы можете сделать, там больше способов, когда ваш креатив. Я могу дать вам пример того, как я использовал модель RegistrationProfile
, но отправил свои собственные шаблоны URL и пользовательский вид на основе классов которые обрабатывали процесс регистрации.
Теперь, когда virtualenv вступает в игру, вы, скорее всего, будете использовать pip, чтобы указать и предоставить свои необходимые зависимости в формат файла требований. Это, когда вы хотите сказать: "Я расширил приложение регистрации django, но оно не будет работать чисто с любой версией. Должно быть, это релиз X" или "проверка из репозитория commit Y".
Ответ 3
Это сообщение в блоге, которое ссылается на эту проблему, чрезвычайно полезно. Для удобства я скопирую его здесь:
Вы не касаетесь внешнего кода приложения
Вы не должны редактировать код из внешнего приложения. Если вы не разблокируете его сначала на 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 вместо формы регистрации userenas.
Этот трюк работает с любым аргументом представления. Те, которые вы должны увидеть чаще всего:
-
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 apps
- Нажмите кнопку вилки
- Это сделает вам репозиторий с копией django-userena
- Установите его как таковой: pip install -e
git [email protected]: ваше-имя пользователя/Джанго-userena.git # яйцо = Джанго-userena
- Затем вы можете отредактировать код в файле yourenv/src/django-userena
- Нажмите свои коммиты
Кредиты писателю!