我有一个 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
我遇到了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直接提供的,所以它也会被重写.
我想在删除容器中的项目后重定向到容器的父级。为此,我尝试订阅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 等属性值相同。
如何区分请求删除项目、取消请求和实际删除项目?
更新:看来初始事件被调用是因为该对象被从容器中删除以检查链接完整性,此时会发生回滚。
我有一个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)
它仍然感觉我正在复制表单行为的一部分,但至少它使用提供表单默认值的相同功能.
我需要一个 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) 使用带有Plone 4.1的jQuery SlickGrid插件并尝试调整网格列的大小会导致jQuery 1.4.4错误,这个错误已在更新版本中修复.
是否可以升级Plone使用的jQuery核心版本,如果是这样,如何做到这一点?
我目前正在使用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) 所以我在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)
什么是最好的方法,最有效的方法呢?我很喜欢编程,对不起是菜鸟.谢谢.
这是我的清单和代码:
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”的索引!
如何在列表中找到第二次出现的字符串?