manage.py
импортится до того, как запатчится.mypackage.mymodule.foo
, где используется urlopen
из urllib
:from urllib.request import urlopen
def foo():
...
urlopen
.@patch("urllib.request.urlopen")
def test(urlopen):
...
@patch("mypackage.mymodule.urlopen")
def test(urlopen):
...
post_save
надо, pre_save
тут точно мимо) отрабатывает сразу после того, как будет сохранён объект User
. Пока всё ок.m2m_changed
, но это будет костыль, потому что этот сигнал будет вызван 2N раз, где N - число добавлений/удалений из m2m. user@user-workstation:/tmp/test$ docker container run --rm -v ${PWD}:/tmp -u $(id -u ${USER}):$(id -g ${USER}) ubuntu:18.04 touch /tmp/it.is.my.file
user@user-workstation:/tmp/test$ ll
итого 20
drwxrwxr-x 2 user user 4096 янв 22 13:55 ./
drwxrwxrwt 23 root root 16384 янв 22 13:55 ../
-rw-r--r-- 1 user user 0 янв 22 13:55 it.is.my.file
user@user-workstation:/tmp/test$ rm it.is.my.file
user@user-workstation:/tmp/test$ docker container run --rm -v ${PWD}:/tmp ubuntu:18.04 touch /tmp/it.is.my.file
user@user-workstation:/tmp/test$ ll
итого 20
drwxrwxr-x 2 user user 4096 янв 22 14:01 ./
drwxrwxrwt 23 root root 16384 янв 22 14:01 ../
-rw-r--r-- 1 root root 0 янв 22 14:01 it.is.my.file
user@user-workstation:/tmp/test$
и есть html файл который определяет по ссылке какое приложение сейчас используется.
в нём есть некоторый шаблон, подставляются значения из самой базы
def save_model(self, request, obj, form, change):
r = requests.get(url, stream=True)
r.raw.decode_content = True
obj.image.save(os.path.join('img', '{}.jpg'.format(slugify(unidecode(obj.title)))), r.raw)
obj.save()
os.path.join
формирует путь из директорий и имени файла, но имя отдельно взятой папки или файла им формировать не нужно. Как наиболее просто
freeze_time
число секунд, так будет удобнее хранить в БД и оно удобно конвертируется в/из timedelta, который уже можно прибавлять к datetime
.>>> from datetime import datetime, timedelta, now
>>> begin_date = datetime(2017, 9, 1, 0, 0, 0)
>>> end_date = datetime(2017, 9, 30, 0, 0, 0)
>>> freeze_time = end_date - now()
>>> freeze_time
datetime.timedelta(2, 17264, 411894)
>>> freeze_time.total_seconds()
190064.411894
>>> freeze_time = int(freeze_time.total_seconds())
>>> freeze_time
190064
>>> now() + timedelta(seconds=freeze_time)
datetime.datetime(2017, 9, 30, 0, 1, 1, 371159)
{% extends 'admin/base_site.html' %}
{% extends 'admin/base_site.html' %}
{% load js_storage %}
{% load admin_static %}
{% load i18n %}
{% load pipeline %}
{% block extrastyle %}
{{ block.super }}
{% stylesheet 'Jcrop' %}
{% stylesheet 'admin-core' %}
{% endblock %}
{% block extrahead %}
{{ block.super }}
{% js_storage_out %}
{% endblock %}
{# Из заголовка удалили конкретную для страницы крошку, оставив только site_title #}
{% block title %}{{ site_title|default:_('Django site admin') }}{% endblock %}
{# Добавили логотип #}
{% block branding %}
<img src="{% static "images/logo_50.png" %}" class="logo" />
{{ block.super }}
{% endblock %}
{# Убрали приветствие пользователя #}
{% block welcome-msg %}
{% endblock %}
{# Убрали ссылку View Site #}
{% block userlinks %}
{% if user.is_active and user.is_staff %}
{% url 'django-admindocs-docroot' as docsroot %}
{% if docsroot %}
<a href="{{ docsroot }}">{% trans 'Documentation' %}</a> /
{% endif %}
{% endif %}
{% if user.has_usable_password %}
<a href="{% url 'admin:password_change' %}">{% trans 'Change password' %}</a> /
{% endif %}
<a href="{% url 'admin:logout' %}">{% trans 'Log out' %}</a>
{% endblock %}
{% block footer %}
{{ block.super }}
{% javascript 'jquery-mousewheel' %}
{% javascript 'js-cookie' %}
{% javascript 'Jcrop' %}
{% javascript 'plupload' %}
{% javascript 'admin-core' %}
{% endblock %}
users
, в нём есть модель user
, и для неё мне нужно кастомизировать шаблон списка объектов, то я создаю файл templates/admin/users/user/change_list.html
и делаю там, что мне нужно{% extends 'admin/change_list.html' %}
{% block extrahead %}
{{ block.super }}
<script type="text/javascript">
var url = js_storage.url_users_user_show_user_password;
(function($) {
$(document).ready(function($) {
$('#result_list td.field-rawpassword').click(function(event){
var $target = $(event.currentTarget);
var user_id = $target.closest('tr').find('td.action-checkbox input[type=checkbox]').val()
if(!$target.data('shown')){
$.get(url, {user_id: user_id}, function(data, status, xhr){
$target.html('<span style="font-family: Monospace">' + data.raw_password + '</span>');
$target.data('shown', true);
});
}
});
});
})(django.jQuery);
</script>
{% endblock %}
requirements.txt
, например. Где помимо прочих зависимостей, также должен быть прописан сельдерей нужной версии:..
celery==X.Y.Z
..
pip install -r /path/to/requirements.txt
/path/to/virtualenv/bin/celery --params ....
Meta.ordering
в модели, на которую ссылается ваш внешний ключformfield_for_foreignkey
в классе админки вашей модели