小编dge*_*gel的帖子

Android中的活动转换

如何定义Android 1.5及更高版本的两个活动之间的转换?我希望活动能够淡出.

android transition android-activity

185
推荐指数
8
解决办法
24万
查看次数

如何创建月迭代器

我想创建一个python函数,允许我迭代从起点到停止点的几个月.例如,它看起来像

def months(start_month, start_year, end_month, end_year):
Run Code Online (Sandbox Code Playgroud)

呼叫months(8, 2010, 3, 2011)将返回:

((8, 2010), (9, 2010), (10, 2010), (11, 2010), (12, 2010), (1, 2011), (2, 2011), (3, 2011))
Run Code Online (Sandbox Code Playgroud)

该函数可以返回一个元组元组,但我希望将其视为生成器(即使用yield).

我检查了calendarpython模块,它似乎没有提供此功能.我可以写一个令人讨厌的for循环来轻松地完成它,但我很想知道专业人员可以做得多么优雅.

谢谢.

python

22
推荐指数
4
解决办法
2万
查看次数

模拟default = timezone.now进行单元测试

我正在尝试为执行大量日期操作的django应用程序编写单元测试.我为我的测试安装了模拟猴子补丁django的timezone.now.

虽然我能够成功地嘲笑timezone.now时,它通常被称为(实际调用timezone.now()在我的代码,我不能嘲笑它为与一个创建的模型DateTimeFielddefault=timezone.now.


我有一个User包含以下内容的模型:

from django.utils import timezone
...
timestamp = models.DateTimeField(default=timezone.now)
modified = models.DateTimeField(default=timezone.now)
...
def save(self, *args, **kwargs):
    if kwargs.pop('modified', True):
        self.modified = timezone.now()
    super(User, self).save(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

我的单元测试看起来像这样:

from django.utils import timezone

def test_created(self):
    dt = datetime(2010, 1, 1, tzinfo=timezone.utc)
    with patch.object(timezone, 'now', return_value=dt):
        user = User.objects.create(username='test')
        self.assertEquals(user.modified, dt)
        self.assertEquals(user.timestamp, dt)
Run Code Online (Sandbox Code Playgroud)

assertEquals(user.modified, dt)通过,但assertEquals(user.timestamp, dt)没有.

我怎么能模仿timezone.now,即使default=timezone.now在我的模型中也会创建模拟时间?


编辑

我知道我可以改变我的单元测试以通过timestamp …

python django unit-testing mocking python-mock

17
推荐指数
3
解决办法
5989
查看次数

从自定义包含模板标记中访问STATIC_URL

我创建了一个自定义包含模板标记,它接受单个Update模型对象.

模板标签:

@register.inclusion_tag('update_line.html')
def update_line(update):
    return {'update': update}
Run Code Online (Sandbox Code Playgroud)

update_line.html:

<tr><td class="update">{{ update }}</td><td class="ack">
<img id="update-{{ update.pk }}" class="ack-img" src="{{ STATIC_URL }}img/acknowledge.png" alt="Acknowledge" /></td></tr>
Run Code Online (Sandbox Code Playgroud)

问题是{{ STATIC_URL }}我的包含模板标签模板中没有这个问题,即使我正在使用django.core.context_processors.static上下文处理器,因此{{ STATIC_URL }}我可以使用所有未通过包含模板标签处理的"普通"模板.

有没有一种方法可以STATIC_URL从我的包含模板标签模板中获取,而不会做一些令人讨厌的事情,比如手动从设置中获取并明确地将其作为上下文变量传递?

django django-templates

7
推荐指数
1
解决办法
3590
查看次数

Django URL与GET变量不匹配

我有以下django网址:

url(r'^companies/$', 'companies', name='companies'),
Run Code Online (Sandbox Code Playgroud)

如果我去http://localhost:8000/companies/它完美的工作.但是,如果我尝试向URL添加任何GET变量,则django会引发404.例如,如果我去http://localhost:8000/companies/?c=1django会引发404.有什么奇怪的,就是在404上它说:

当前的URL companies/与任何这些都不匹配.

为什么我无法将GET变量传递给我的网址?

我正在使用django 1.4.

公司视图定义如下:

def companies(request):
Run Code Online (Sandbox Code Playgroud)

它不应该接受任何其他参数,因为它们是GET变量,而不是URL参数 - 正确吗?我发誓我已经完成了数百次,它总是有效......

django

7
推荐指数
1
解决办法
1302
查看次数

防止MySQL-Python在数据库名称参数周围插入引号

我正在开发一个项目,要求我以编程方式从django应用程序创建MySQL用户.我可以很好地创建用户:

from django.db import connection, transaction
cursor = connection.cursor()
cursor.execute("CREATE USER %s@'%'", 'username')
cursor.execute("SET PASSWORD FOR %s@'%' = PASSWORD(%s)", ('username', 'pass'))
Run Code Online (Sandbox Code Playgroud)

这非常有效.问题是当我尝试授予权限时.数据库名称也以编程方式确定:

cursor.execute("GRANT SELECT ON %s.* TO %s@'%'", ('dbname', 'username'))
Run Code Online (Sandbox Code Playgroud)

这会导致mysql错误,因为当它执行字符串替换时,它会在数据库名称周围放置单引号,这在语法上是不正确的:

DatabaseError:(1064,"你的SQL语法有错误;请查看与你的MySQL服务器版本相对应的手册,以便在第1行使用''dbname'.*''username'@'%'附近的正确语法")

如何防止在%sfor数据库名称周围添加单引号?我知道我可以简单地在Python中进行字符串替换并修复它,但这可能会导致SQL注入漏洞.

python mysql django mysql-python

6
推荐指数
1
解决办法
2247
查看次数

在 HttpResponse 中返回 python 字节数组

我有一个 django 视图,我想返回一个 Excel 文件。代码如下:

def get_template(request, spec_pk):
    spec = get_object_or_404(Spec, pk=spec_pk)

    response = HttpResponse(spec.get_template(), mimetype='application/ms-excel')
    response['Content-Disposition'] = 'attachment; filename=%s_template.xls' % spec.name
    return response
Run Code Online (Sandbox Code Playgroud)

在该示例中, 的类型spec.get_template()包含<type 'bytearray'>Excel 电子表格的二进制数据。

问题是,当我尝试下载该视图并使用 Excel 打开它时,它会以乱码二进制数据的形式出现。我知道这bytearray是正确的,因为如果我执行以下操作:

f = open('temp.xls', 'wb')
f.write(spec.get_template())
Run Code Online (Sandbox Code Playgroud)

temp.xls我可以在Excel中完美打开。

我什至将我的观点修改为:

def get_template(request, spec_pk):
    spec = get_object_or_404(Spec, pk=spec_pk)
    f = open('/home/user/temp.xls', 'wb')
    f.write(spec.get_template())
    f.close()

    f = open('/home/user/temp.xls', 'rb')
    response = HttpResponse(f.read(), mimetype='application/ms-excel')
    response['Content-Disposition'] = 'attachment; filename=%s_template.xls' % spec.name
    return response
Run Code Online (Sandbox Code Playgroud)

它运行完美 - 我可以从浏览器将 xls 文件打开到 Excel,一切正常。 …

python django

5
推荐指数
1
解决办法
3600
查看次数

如何通过另一个计算列使用一个计算列

我在 Sqlite 中有一个查询涉及复杂的列计算,比方说:

SELECT 1+1 AS a;
Run Code Online (Sandbox Code Playgroud)

我想将此计算选择为a,但我还需要将其用作另一个计算的组成部分:

SELECT 1+1 AS a, a+2 AS b;
Run Code Online (Sandbox Code Playgroud)

不幸的是这会产生错误:

Error: no such column: a
Run Code Online (Sandbox Code Playgroud)

我知道我可以简单地再次重复计算b

SELECT 1+1 AS a, 1+1+2 AS b;
Run Code Online (Sandbox Code Playgroud)

但假设1+1是一些复杂且昂贵的操作,有什么方法可以让我稍后引用它而SELECT不必重新计算它?

sql sqlite

5
推荐指数
1
解决办法
4877
查看次数

无法删除post_delete中的FileField文件

我有一个模型FileField:

class FileModel(models.Model):
    name = models.CharField(max_length=100)
    description = models.CharField(max_length=200)
    file = models.FileField(upload_to='myfiles')
Run Code Online (Sandbox Code Playgroud)

当您使用a删除模型实例时FileField,django不会自动从文件系统中删除基础文件,因此我设置了一个信号来删除基础文件post_delete:

def on_delete(sender, instance, **kwargs):
    instance.file.delete()

models.signals.post_delete.connect(on_delete, sender=FileModel)
Run Code Online (Sandbox Code Playgroud)

问题是,当我删除一个FileModel对象(比如说来自django管理页面)时,它会从文件系统中删除该文件,但不会删除该模型.如果我再次删除它,它会删除模型,但在尝试从文件系统中删除文件时会引发异常,因为该文件不存在.

当我更改文件删除时,pre_delete而不是post_delete它应该行为.我能想到的唯一可能导致此行为的是,如果从FileField自动保存模型中删除文件,则会导致重新创建该模型post_delete.

所以我的问题是:为什么调用一个FileField删除方法来post_delete阻止模型被删除?

django django-models

4
推荐指数
1
解决办法
1379
查看次数

计算上一季度的结束

我正在寻找一种优雅和pythonic的方式来获得上一季度结束的日期.

像这样的东西:

def previous_quarter(reference_date):
   ...


>>> previous_quarter(datetime.date(2013, 5, 31))
datetime.date(2013, 3, 31)

>>> previous_quarter(datetime.date(2013, 2, 1))
datetime.date(2012, 12, 31)

>>> previous_quarter(datetime.date(2013, 3, 31))
datetime.date(2012, 12, 31)

>>> previous_quarter(datetime.date(2013, 11, 1))
datetime.date(2013, 9, 30)
Run Code Online (Sandbox Code Playgroud)

编辑:我尝试过什么吗?

是的,这似乎有效:

def previous_quarter(ref_date):
    current_date = ref_date - timedelta(days=1)
    while current_date.month % 3:
        current_date -= timedelta(days=1)
    return current_date
Run Code Online (Sandbox Code Playgroud)

但它似乎是不必要的迭代.

python

3
推荐指数
2
解决办法
5232
查看次数