如何为同一模型创建多个ModelAdmin,每个模型以不同方式自定义并链接到不同的URL?
假设我有一个名为Posts的Django模型.默认情况下,此模型的管理视图将列出所有Post对象.
我知道我可以通过设置list_display等变量或覆盖queryset我的ModelAdmin中的方法来以各种方式自定义页面上显示的对象列表,如下所示:
class MyPostAdmin(admin.ModelAdmin):
list_display = ('title', 'pub_date')
def queryset(self, request):
request_user = request.user
return Post.objects.filter(author=request_user)
admin.site.register(MyPostAdmin, Post)
Run Code Online (Sandbox Code Playgroud)
默认情况下,可以通过URL访问它/admin/myapp/post.但是我想拥有相同模型的多个视图/ ModelAdmins.例如/admin/myapp/post,列出所有帖子对象,并/admin/myapp/myposts列出属于该用户的/admin/myapp/draftpost所有帖子,并列出所有尚未发布的帖子.(这些只是示例,我的实际用例更复杂)
您不能为同一模型注册多个ModelAdmin(这会导致AlreadyRegistered异常).理想情况下,我希望在不将所有内容放入单个ModelAdmin类并编写自己的"urls"函数的情况下实现此目的,以根据URL返回不同的查询集.
我已经看过Django源了,我看到这样的函数ModelAdmin.changelist_view可能以某种方式包含在我的urls.py中,但我不确定它究竟是如何工作的.
更新:我找到了一种做我想做的事情(见下文),但我仍然希望听到其他方法.
我想有几个不同的版本在Django相同的语言,定制不同的国家(例如locale/en,locale/en_CA,locale/en_US等).如果没有特定国家/地区的语言,我希望使用默认语言版本(locale/en)).
然后在设置文件为每个站点我指定LANGUAGE_CODE和LANGUAGES.
出于某种原因,即使我指定以下设置,locale/en_US仍然使用翻译:
LANGUAGE_CODE = 'en'
LANGUAGES = (
('en', ugettext('English')),
)
Run Code Online (Sandbox Code Playgroud)
虽然我明确指出语言代码应该是en(不是en-us).
我错过了什么吗?已经尝试在多个地方找到答案,包括Django文档.
在我的OpenERP安装中,我有以下字段,之前不需要,但我将所需的参数更改为True.
'fiscal_position': fields.many2one(
'account.fiscal.position',
'Fiscal Position',
required=True,
readonly=True,
states={'draft':[('readonly',False)]}
),
Run Code Online (Sandbox Code Playgroud)
在调试日志中,我看到ORM尝试为数据库中的该字段设置非空约束.
2013-01-04 15:28:56 EET STATEMENT: ALTER TABLE "account_invoice"
ALTER COLUMN "fiscal_position" SET NOT NULL
Run Code Online (Sandbox Code Playgroud)
我怎么能防止这种情况?我的想法是获得所需的True标志,仅用于新记录并且没有NOT NULL约束.在其他情况下发生PostgreSQL完整性错误:
IntegrityError: null value in column "fiscal_position" violates
not-null constraint
Run Code Online (Sandbox Code Playgroud)
那么,我怎样才能在表单视图中有一个必填字段,而不使ORM触及数据库方案约束?或者如何根据对象的状态动态更改所需的字段?
我说的是一般情况.这是一个例子:
c = 1
def a():
def b():
print(c)
b()
c = 2
a()
Run Code Online (Sandbox Code Playgroud)
此代码将返回以下错误:
NameError: free variable 'c' referenced before assignment in enclosing scope.虽然逻辑假设是输出应该是1.什么是Pythonic解决这个问题的方法?使用global或nonlocal语句(我不喜欢)?也许只是避免这种情况,多个范围共享具有相同名称的变量?
我正在开发 Python Web 应用程序,该应用程序在开发环境中使用 MySQL 作为数据库后端,在生产环境中使用 Oracle 11g。是否有统一 SQLAlchemy 文本字段的特定方法,以便它们在 MySQL 和 Oracle 数据库上工作?对于我使用的模型中的 Oracle 后端sqlalchemy.CLOB和 MySQL sqlalchemy.TEXT。
blocktrans在某些Django模板中镜像以下内容:
{% blocktrans %}
Some Text
{% endblocktrans %}
Run Code Online (Sandbox Code Playgroud)
在模板中进行了一些更改之后,您可能希望缩进该块:
<div>
{% blocktrans %}
Some Text
{% endblocktrans %}
</div>
Run Code Online (Sandbox Code Playgroud)
这将更改翻译文件中的消息,并将其标记为模糊。从技术上讲,它是相同的消息(只是缩进不同)。
这些消息“模糊不清”的整个过程是乏味且容易出错的。
到目前为止我尝试过的是:
trans尽可能多的-并不总是工作blocktrans语句的初始缩进-难以维护有没有办法使缩进blocktrans微不足道?
当我从Amazon RDS创建数据库转储然后尝试在本地导入它时,结果是ERROR 1064 (42000) at line 54.
在第54行,有以下声明:
CREATE TABLE account_emailconfirmation (
用于转储的命令是:
mysqldump -u user -h host.rds.amazonaws.com -p --default-character-set=utf8 --result-file=sync.sql database_name
用于导入的命令是:
mysql --user=root -p mpl -vv < sync.sql
这是输出(详细程度增加).
--------------
CREATE TABLE `account_emailconfirmation` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`created` datetime(6) NOT NULL,
`sent` datetime(6) DEFAULT NULL,
`key` varchar(64) NOT NULL,
`email_address_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `key` (`key`),
KEY `acc_email_address_id_5bcf9f503c32d4d8_fk_account_emailaddress_id` (`email_address_id`),
CONSTRAINT `acc_email_address_id_5bcf9f503c32d4d8_fk_account_emailaddress_id` FOREIGN KEY (`email_address_id`) REFERENCES `account_emailaddress` (`id`)
) ENGINE=InnoDB DEFAULT …Run Code Online (Sandbox Code Playgroud) python ×6
django ×3
django-i18n ×2
database ×1
django-admin ×1
mysql ×1
mysqldump ×1
openerp ×1
postgresql ×1
python-2.x ×1
python-3.x ×1
rds ×1
sqlalchemy ×1