这对于非内联很容易.只需覆盖admin.py AdminOptions中的以下内容:
def formfield_for_dbfield(self, db_field, **kwargs):
if db_field.name == 'photo':
kwargs['widget'] = AdminImageWidget()
return db_field.formfield(**kwargs)
return super(NewsOptions,self).formfield_for_dbfield(db_field,**kwargs)
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚如何使其适应内联工作.
我认为在最近的Django版本中有一个简单的答案,但我找不到它.
我有触及数据库的代码.我希望每次Django启动时都能运行它.我似乎有两个选择:
选项1. AppConfig.ready() - 这可以工作,但也可以在创建数据库表之前运行(即在测试期间或在没有数据的情况下重新初始化应用程序时).如果我使用它,我必须捕获多种类型的异常,并猜测原因是一个空数据库:
def is_db_init_error(e, table_name):
return ("{}' doesn't exist".format(table_name) in str(e) or
"no such table: {}".format(table_name) in str(e)
)
try:
# doing stuff
except Exception as e:
if not is_db_init_error(e, 'foo'):
raise
else:
logger.warn("Skipping updating Foo object as db table doesn't exist")
Run Code Online (Sandbox Code Playgroud)
选项2.使用post_migrate.connect(foo_init, sender=self)- 但这仅在我进行迁移时运行.
选项3.旧的方式 - 从中调用urls.py- 我想保留这样的东西urls.py,我认为这AppConfig是一条真正的道路
到目前为止,我已经确定了选项2了 - 我不喜欢选项1和选项3中的臭臭尝试/除了东西,因为它urls.py变成了倾销场.
但是,当我在本地开发时,选项2经常让我兴奋 - 我需要记住每当我想要运行init代码时运行迁移.拉下生产数据库或类似数据库之类的事情通常会导致问题,因为不会触发迁移.
我正在使用memcached作为后端的站点范围缓存.我想在底层数据库对象更改时使缓存中的页面无效.
如果页面名称发生更改,那么我将使整个缓存无效(因为它会影响每个页面上的导航.笨拙但足以满足我的需求.
如果只是页面内容发生了变化,那么我想使该页面的缓存无效.
是否有捷径可寻?
因此,Django表单的视图逻辑的标准模式是:
def contact(request):
if request.method == 'POST': # If the form has been submitted...
form = ContactForm(request.POST) # A form bound to the POST data
if form.is_valid(): # All validation rules pass
# Process the data in form.cleaned_data
# ...
return HttpResponseRedirect('/thanks/') # Redirect after POST
else:
form = ContactForm() # An unbound form
return render_to_response('contact.html', {
'form': form,
})
Run Code Online (Sandbox Code Playgroud)
这在简单的情况下很好,但如果您的应用程序逻辑变得更复杂,则很容易陷入复杂的嵌套IF语句.
任何人都可以分享他们自己的清洁方法,避免嵌套的IF和逻辑依赖于落空情况?
我对那些不依赖其他第三方应用程序的答案特别感兴趣.
ORM的美丽让我沉浸在睡眠中.我有一个缺乏数据库索引的现有Django应用程序.有没有办法自动生成需要索引的列列表?
我想也许是一些中间件记录哪些列涉及WHERE子句?但MySQL内置了什么可能有帮助吗?
我正在管理ModelForm上的'clean'做一些事情:
class MyAdminForm(forms.ModelForm):
def clean(self):
# Some stuff happens...
request.user.message_set.create(message="Some stuff happened")
class MyAdmin(admin.ModelAdmin):
form = MyAdminForm
Run Code Online (Sandbox Code Playgroud)
除了threadlocals hack之外 - 我如何访问request.user来设置消息?我无法将其传递给表单构造函数,因为不会从我的代码中调用它.
我有一些代码可以在每个(几乎)每个管理请求上运行但无法访问'request'对象.
我需要找到Django安装的路径.我可以:
import django
django_path = django.__file__
Run Code Online (Sandbox Code Playgroud)
但是在请求中间这似乎相当浪费.
将导入放在模块的开头会浪费内存吗?我很确定我在这里错过了一个明显的伎俩.
我正在覆盖ModelAdmin方法:
def response_change(self, request, obj):
# alter redirect location if 'source' is found in GET
response = super(JobOptions, self).response_change(request, obj)
source = request.GET.get('source', None)
if source:
response['location'] = source
return response
Run Code Online (Sandbox Code Playgroud)
而不是在每个模型上重复这个,我想把它变成混合.
如果我做:
def RedirectMixin(admin.ModelAdmin)
Run Code Online (Sandbox Code Playgroud)
然后:
def MyModel(admin.ModelAdmin, RedirectMixin)
Run Code Online (Sandbox Code Playgroud)
然后我得到一个MRO错误.
但是,如果RedirectMixin不从admin.ModelAdmin继承,则不会调用该方法.
另一个问题是如何泛化super()调用,因此它没有硬编码的超类.
给定日期范围如何计算部分或全部在该范围内的周末数?
(要求的一些定义:将'周末'表示为周六和周日.日期范围包括在内,即结束日期是"全部或部分"范围的一部分意味着周末的任何部分都在日期范围内意味着计算整个周末.)
为了简化我想象你实际上只需要知道持续时间和一周的哪一天是初始的一天......
我现在很好,它将涉及做7的整数除法和一些逻辑,根据余数加1,但我不能弄清楚什么...
Python中答案的额外分数;-)
编辑
这是我的最终代码.
周末是星期五和星期六(因为我们计算的是住宿的夜晚),从星期一开始,天数为0.我使用了onebyone的算法和Tom的代码布局.非常感谢大家.
def calc_weekends(start_day, duration):
days_until_weekend = [5, 4, 3, 2, 1, 1, 6]
adjusted_duration = duration - days_until_weekend[start_day]
if adjusted_duration < 0:
weekends = 0
else:
weekends = (adjusted_duration/7)+1
if start_day == 5 and duration % 7 == 0: #Saturday to Saturday is an exception
weekends += 1
return weekends
if __name__ == "__main__":
days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
for start_day in range(0,7):
for duration in range(1,16):
print "%s …Run Code Online (Sandbox Code Playgroud) 试图调试我的"正确"脚本 - 我试图尝试一个玩具示例 - 这也不起作用.
echo {\"admin\": \"foo\", \"datacenter\": \"bar\"}
Run Code Online (Sandbox Code Playgroud)
直接运行它的行为符合预期:
%: ./test_inv --host blah
{"admin": "foo", "datacenter": "bar"}
Run Code Online (Sandbox Code Playgroud)
但:
%: ansible blah -i test_inv
ERROR: The file test_inv is marked as executable, but failed to execute correctly. If this is not supposed to be an executable script, correct this with `chmod -x test_inv`.
Run Code Online (Sandbox Code Playgroud)
(我假设我不需要支持 - 这个玩具测试的清单,因为我从来没有以这种方式调用它)