小编Mat*_*vor的帖子

使用带有注释的 Django CheckConstraint

我有一个 Django 模型,其中每个实例都需要一个从三个字段派生的唯一标识符:

class Example(Model):
    type = CharField(blank=False, null=False)           # either 'A' or 'B'
    timestamp = DateTimeField(default=timezone.now)
    number = models.IntegerField(null=True)             # a sequential number
Run Code Online (Sandbox Code Playgroud)

这会产生一个形式为 的标签,[type][timestamp YEAR][number]除非number为空,否则它必须是唯一的。

我想我可以使用几个注释:

uid_expr = Case(
    When(
        number=None,
        then=Value(None),
    ),
    default=Concat(
        'type', ExtractYear('timestamp'), 'number',
        output_field=models.CharField()
    ),
    output_field=models.CharField()
)

uid_count_expr = Count('uid', distinct=True)
Run Code Online (Sandbox Code Playgroud)

get_queryset默认情况下,我覆盖了模型的管理器以应用注释,然后尝试使用CheckConstraint

class Example(Model):
    ...

    class Meta:
        constraints = [
            models.CheckConstraint(check=Q(uid_cnt=1), name='unique_uid')
        ]
Run Code Online (Sandbox Code Playgroud)

这失败了,因为它无法在名为 的实例上找到一个字段uid_cnt,但是我认为Q对象可以访问注释。它看起来像是CheckConstraint直接针对模型进行查询,而不是使用管理器返回的查询集:

class CheckConstraint(BaseConstraint):
    ...

    def _get_check_sql(self, model, …
Run Code Online (Sandbox Code Playgroud)

django django-models django-queryset django-q django-constraints

8
推荐指数
1
解决办法
318
查看次数

通过nginx的sub_filter重写CSS和JS中的路径

我遇到了nginx的sub_filter重写规则无法处理CSS文件的问题.我在路径(/site)上提供内容,并且需要JS和CSS中的所有URL都正确地加上前缀.

我在CSS中链接时指定了mime类型.从模板:

<link href="/static/css/site.css" type="text/css" rel="stylesheet" />
Run Code Online (Sandbox Code Playgroud)

nginx启用了子过滤器,我明确指定包括text/css:

location /site {
    access_log /opt/logs/test/nginx-access-site.log combined if=$loggable;
    error_log  /opt/logs/test/nginx-errors-site.log error;

    rewrite ^(/site)$ $1/;
    rewrite ^/site(.+) $1 break;

    sub_filter "test.domain.tld" "test.domain.tld/site";
    sub_filter "'/" "'/site/";
    sub_filter '"/' '"/site/';
    sub_filter "http:" "https:";
    sub_filter_types text/html text/css text/javascript;
    sub_filter_once off;

    include proxy_params;
    proxy_pass http://site_test$1$is_args$args;
    proxy_redirect http://test.domain.tld/ https://test.domain.tld/site/;
}
Run Code Online (Sandbox Code Playgroud)

正确地重写对CSS文件的引用.从HTML输出:

<link href="/site/static/css/site.css" type="text/css" rel="stylesheet" />
Run Code Online (Sandbox Code Playgroud)

问题是它不是在CSS文件中重写,因此图像路径不正确:

.sortable th .asc {
  background-image: url("/static/img/up_arrow.gif");
}
Run Code Online (Sandbox Code Playgroud)

我试过过度宽容而没有任何区别:

    sub_filter_types *;
Run Code Online (Sandbox Code Playgroud)

我误解了使用sub_filter吗?我认为因为CSS是由nginx直接提供的,所以它也会被重写.

nginx

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

Plon:对对象移除做出反应

我想在删除容器中的项目后重定向到容器的父级。为此,我尝试订阅zope.lifecycleevent's IObjectRemovedEvent

@grok.subscribe(ISite, IObjectRemovedEvent)
def redirect_to_trial_on_delete(obj, event):
    request = getattr(obj, 'REQUEST', None)
    if request:
        trial_url = obj.aq_parent.aq_parent.absolute_url()
        request.response.redirect(trial_url)
Run Code Online (Sandbox Code Playgroud)

删除是通过点击触发的container/id/delete_confirmation,但这会引发比我预期更多的事件。我订阅的函数被调用两次:一次是在我单击链接时,另一次是在我确认删除时。更令人困惑的是,如果我取消删除,它也会被调用。我期望只有一个对象从容器中移除时才会引发该事件。

所有三种情况下,事件对象都是相同的,oldName、oldParent 等属性值相同。

如何区分请求删除项目、取消请求和实际删除项目?

更新:看来初始事件被调用是因为该对象被从容器中删除以检查链接完整性,此时会发生回滚。

python plone

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

在以编程方式创建的Dexterity项目上设置字段默认值

我有一个Dexterity内容类型,plone.directives.form.Schema其中包含许多用于分配默认值的表单提示:

@form.default_value(field=ITrial['start_on'])
def default_start_on(data):
    return datetime.now()
Run Code Online (Sandbox Code Playgroud)

一些默认值更复杂,传回自身为Dexterity类型实例的对象.这些对象对于主要类型的设置至关重要,由各种事件触发.

我现在正在测试.理想情况下,我希望能够使用以下内容:

item = createContentInContainer(folder, 'ctcc.model.trial', 'item')
Run Code Online (Sandbox Code Playgroud)

也就是说,我希望项目可以选择默认值而无需手动传递给构造函数.

如果我正在使用,zope.schema我可以使用FieldProperty来设置架构字段的代理.是否存在与Dexterity等效的东西,或者可能是通过表单创建来推送对象的函数?

解决方案:我最终选择了David的选项#1,拦截ObjectCreatedEvent.

@grok.subscribe(ITrial, IObjectCreatedEvent)
def create_trial(trial, event):            
    if getattr(trial, 'start_on', None) is None:
        trial.start_on = default_start_on(None)
Run Code Online (Sandbox Code Playgroud)

它仍然感觉我正在复制表单行为的一部分,但至少它使用提供表单默认值的相同功能.

plone dexterity

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

Django MultiWidget 和字段标签

我需要一个 Django 表单,其中包含 3 个forms.Textarea被压缩为单个models.TextField兼容值的表单。为此,我对forms.MultiValueField和进行了子类化forms.MultiWidget。我的问题是尝试确定在何处以及如何向小部件的textarea输入添加标签。

我当前正在做的是将标签值作为attr小部件的子小部件传递:

class ContentWidget(forms.MultiWidget):
    template_name = 'content_widget.html'

    def __init__(self, attrs=None):
        widgets = (
            forms.Textarea({'label': 'A'}),
            forms.Textarea({'label': 'B'}),
            forms.Textarea({'label': 'C'}),
        )
        super().__init__(widgets, attrs)
Run Code Online (Sandbox Code Playgroud)

这让我保持content_widget.html相当简洁:

{% for subwidget in widget.subwidgets %}
  <label for="{{ subwidget.attrs.id }}">{{ subwidget.attrs.label }}</label>
  {% include subwidget.template_name with widget=subwidget %}
  <br />
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

但这也label为每个 html 元素添加了 attr,这感觉有点 hacky:

{% for subwidget in widget.subwidgets %}
  <label for="{{ subwidget.attrs.id …
Run Code Online (Sandbox Code Playgroud)

python django django-forms

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

Plone:升级jQuery

使用带有Plone 4.1的jQuery SlickGrid插件并尝试调整网格列的大小会导致jQuery 1.4.4错误,这个错误已在更新版本中修复.

是否可以升级Plone使用的jQuery核心版本,如果是这样,如何做到这一点?

jquery plone

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

使用plone.app.testing进行ImportError

我目前正在使用Professional Plone 4 Development,同时使用4.1.2的统一安装程序.我不确定在书中的显式构建过程中使用安装程序是否会导致问题,但是我在将示例与安装的实际情况捆绑在一起时遇到了很多麻烦.现在,我遇到了为我正在创建的策略包运行测试的问题.

在包的setup.py中,我有:

extras_require={
    'test': ['plone.app.testing',]
},
Run Code Online (Sandbox Code Playgroud)

develop.cfg中:

[buildout]
parts +=
    test

[test]
recipe = zc.recipe.testrunner
defaults = ['--auto-color', '--auto-progress']
Run Code Online (Sandbox Code Playgroud)

最后,testing.py导入:

from plone.app.testing import (
    PloneSandboxLayer,
    applyProfile,
    PLONE_FIXTURE,
    IntegrationTesting,
)
Run Code Online (Sandbox Code Playgroud)

在使用开发配置运行buildout之后,测试运行器按预期安装到bin/test.但是尝试运行该包的测试给了我以下内容:

$ bin/test -s ctcc.policy
bin/test:239: DeprecationWarning: zope.testing.testrunner is deprecated in favour of zope.testrunner.
/opt/plone41/buildout-cache/eggs/zope.testing-3.9.6-py2.6.egg/zope/testing/testrunner/formatter.py:28: DeprecationWarning: zope.testing.exceptions is deprecated in favour of zope.testrunner.exceptions
  from zope.testing.exceptions import DocTestFailureException
Test-module import failures:

Module: ctcc.policy.tests

Traceback (most recent call last):
  File "/opt/plone41/zeocluster/src/ctcc.policy/ctcc/policy/tests.py", line 2, in …
Run Code Online (Sandbox Code Playgroud)

testing plone buildout

3
推荐指数
1
解决办法
601
查看次数

什么是在python中转换列表的最有效方法

所以我在python中有这个列表,

a=  [[1,2,3,4],
     [2,4,5,1],
     [3,4,6,2],
     [2,3,4,5]]
Run Code Online (Sandbox Code Playgroud)

并希望将列表水平翻转为垂直.

b=    [[1,2,3,2],
       [2,4,4,3],
       [3,5,6,4],
       [4,1,2,5]]
Run Code Online (Sandbox Code Playgroud)

什么是最好的方法,最有效的方法呢?我很喜欢编程,对不起是菜鸟.谢谢.

python

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

查找列表中字符串第二次出现的索引

这是我的清单和代码:

x=[["hi hello"], ["this is other"],["this"],["something"],["this"],["last element"]]
for line in x:
    y=x.index(line)
    #code
Run Code Online (Sandbox Code Playgroud)

第一次获得“ this”,它可以正常工作,但是第二次,它仅获得第一个“ this”的索引!

如何在列表中找到第二次出现的字符串?

python string

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