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
  • Нажмите свои коммиты

Кредиты писателю!