django: изменение / расширение сторонних приложений - PullRequest
12 голосов
/ 08 декабря 2011

вопрос новичка Джанго

Я хочу использовать стороннее приложение, но мне нужно внести в него некоторые моды (в данном случае это django-регистрация, и мне нужно изменить такие вещи, как разрешение регистрации без подтверждения по электронной почте)

Изначально я просто установил приложение в общую папку site-packages и изменил там код. Теперь, когда я поместил свой код в bitbucket, мне нужен способ, позволяющий сохранять мои моды в репозитории удобным для использования способом, и загрузка полного кода Python не кажется хорошей идеей.

Полагаю, лучшим способом было бы сохранить стороннее приложение в пакетах сайта и создать приложение в моем проекте, чтобы сохранить мои изменения. В моем случае я бы создал my-django-registration в моем проекте, а затем импортировал это, когда мне нужно в моем коде, а не django-registration.

Я также читал о virtualenv, но я думаю, что он в основном используется для возможности использования нескольких сред на одном компьютере (фактически, где-то это не советует менять модули, установленные в virtualenv), и не помогает мне хранение моих изменений в хранилище.

Любые комментарии приветствуются! Спасибо

Ответы [ 3 ]

18 голосов
/ 09 декабря 2011

Как правило, вы должны повторно использовать и переопределять поведение в сторонних приложениях, а не изменять их источники.

Чаще всего вы сталкиваетесь с тем, что приложения поставляют модели, которые не обязательно соответствуют вашим потребностям, но выполняют большую часть работы; у вас будут формы, которые почти идеальны, но нуждаются в этом немного; у вас будут представления, которые были бы идеальными, если бы вы могли просто изменить одну вещь; у вас будут нормальные URL, но вам нужно что-то еще от них.

В большинстве случаев для этого просто нужно создать собственное приложение и переписать все. Отправляйте свои собственные URL-адреса, которые сопоставляются с представлениями, которые вы расширили, и переопределите методы для пользовательского поведения; предоставьте ему форму модели, которая Meta использует новую модель, которую вы расширили от оригинала; и так далее ...

Это только вершина айсберга того, что вы можете сделать, есть больше способов, когда ваше творчество. Я могу дать вам пример того, как я использовал модель RegistrationProfile, но отправил свои собственные шаблоны URL и пользовательское представление на основе классов, которое обрабатывало процесс регистрации.

Теперь, когда в игру вступает virtualenv, вы, скорее всего, будете использовать pip для указания и предоставления необходимых зависимостей в формате файла требований . Вот когда вы хотите сказать: «Я расширил приложение регистрации django, но оно не будет работать корректно только с любой версией. Оно должно быть версии X», или «извлечение из репозитория commit Y ».

5 голосов
/ 10 октября 2016

Этот пост , посвященный этой проблеме, чрезвычайно полезен. Для удобства скопирую сюда:

Вы не касаетесь внешнего кода приложения

Вы не должны редактировать код из внешнего приложения. Если вы сначала не раскошелитесь на 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
  • Нажмите ваши коммиты

Кредиты автору сообщения!

0 голосов
/ 08 декабря 2011

Я думаю, что лучший способ выполнить то, что вы ищете, - это разветвить django-регистрацию и использовать в своем приложении разветвление вместо исходного проекта.

При этом вы можете иметь-регистрация электронной почты в django-регистрации без изменения кода приложения.Я сделал это путем создания пользовательского регистрационного бэкэнда , который устанавливает пользователей активированными при создании. Здесь вы можете увидеть другие способы сделать то же самое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...